Advanced Lane Lines

In [2]:
# Import necessary libraries
import numpy as np
import pandas as pd
import os
import json
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, Convolution2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
from keras.optimizers import SGD, Adam, RMSprop
from sklearn.model_selection import train_test_split
from keras.callbacks import ModelCheckpoint, EarlyStopping
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from scipy import ndimage
from scipy.misc import imresize
import cv2

print("All module loaded")
Using TensorFlow backend.
All module loaded

Calibrating

In [3]:
# Construct arrays for center, right and left images of controlled driving
images = np.asarray(os.listdir("camera_cal/"))

chess_data= []

# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((5*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:5].T.reshape(-1,2)
# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

count = 0
for image in images:
    image_file = os.path.join('camera_cal/', image)
    image_data = cv2.imread(image_file)
    gray = cv2.cvtColor(image_data, cv2.COLOR_BGR2GRAY)
    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, (9,5), None)
    # If found, add object points, image points (after refining them)
    chess_data.append(image_data)
    if ret == True:
        objpoints.append(objp)
        corners2=cv2.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria)
        imgpoints.append(corners)
        # Draw and display the corners
        cv2.drawChessboardCorners(image_data, (9,5), corners2, ret)
#         print(""true"")
#         plt.imshow(image_data)

        
#     #     chess_data[count] = image_data
#     break
%matplotlib inline
plt.imshow(chess_data[0])


# plt.imshow(image_data[0])

# print(len(image_data))
Out[3]:
<matplotlib.image.AxesImage at 0x116ef76d8>

Distortion Correction

In [4]:
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
undist = cv2.undistort(chess_data[11], mtx, dist, None, mtx)
%matplotlib inline
plt.imshow(undist)
Out[4]:
<matplotlib.image.AxesImage at 0x116f81a20>
In [254]:
imageTest = mpimg.imread('perspective_straight.jpg')
undistTest = cv2.undistort(imageTest, mtx, dist, None, mtx)

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9))
f.tight_layout()
ax1.imshow(imageTest)
ax1.set_title('Original Image', fontsize=50)
ax2.imshow(undistTest)
ax2.set_title('Undistorted Image', fontsize=50)
plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)

now we've got the undistorted image, the next step is to use sobel threshould and color space to extract lane lines.

Threshold

In [255]:
def abs_sobel_thresh(img, orient='x', sobel_kernel=3,thresh=(0, 255)):
    # Convert to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # Apply x or y gradient with the OpenCV Sobel() function
    # and take the absolute value
    if orient == 'x':
        abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 1, 0))
    if orient == 'y':
        abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 0, 1))
    # Rescale back to 8 bit integer
    scaled_sobel = np.uint8(255*abs_sobel/np.max(abs_sobel))
    # Create a copy and apply the threshold
    binary_output = np.zeros_like(scaled_sobel)
    # Here I'm using inclusive (>=, <=) thresholds, but exclusive is ok too
    binary_output[(scaled_sobel >= thresh[0]) & (scaled_sobel <= thresh[1])] = 1

    # Return the result
    return binary_output

def mag_thresh(img, sobel_kernel=3, mag_thresh=(0, 255)):
    # Convert to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # Take both Sobel x and y gradients
    sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=sobel_kernel)
    sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=sobel_kernel)
    # Calculate the gradient magnitude
    gradmag = np.sqrt(sobelx**2 + sobely**2)
    # Rescale to 8 bit
    scale_factor = np.max(gradmag)/255 
    gradmag = (gradmag/scale_factor).astype(np.uint8) 
    # Create a binary image of ones where threshold is met, zeros otherwise
    binary_output = np.zeros_like(gradmag)
    binary_output[(gradmag >= mag_thresh[0]) & (gradmag <= mag_thresh[1])] = 1

    # Return the binary image
    return binary_output


def dir_threshold(img, sobel_kernel=3, thresh=(0, np.pi/2)):
    # Grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # Calculate the x and y gradients
    sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=sobel_kernel)
    sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=sobel_kernel)
    # Take the absolute value of the gradient direction, 
    # apply a threshold, and create a binary image result
    # Here I'm suppressing annoying error messages
    with np.errstate(divide='ignore', invalid='ignore'):
        absgraddir = np.absolute(np.arctan(sobely/sobelx))
        binary_output =  np.zeros_like(absgraddir)
        binary_output[(absgraddir >= thresh[0]) & (absgraddir <= thresh[1])] = 1

    # Return the binary image
    return binary_output

def color_threshold(img,thresh=(0,255)):
    hls = cv2.cvtColor(img, cv2.COLOR_RGB2HLS)
    s_channel = hls[:,:,2]
    s_binary = np.zeros_like(s_channel)
    s_binary[(s_channel >= thresh[0]) & (s_channel <= thresh[1])] = 1
#     retval, s_binary = cv2.threshold(s.astype('uint8'), thresh[0], thresh[1], cv2.THRESH_BINARY)
    return s_binary
    
In [256]:
def get_threshold_image(img):
    undistTest = cv2.undistort(img, mtx, dist, None, mtx)
    ksize = 5

    # Apply each of the thresholding functions
    gradx = abs_sobel_thresh(undistTest, orient='x', sobel_kernel=3, thresh=(50, 100))
    grady = abs_sobel_thresh(undistTest, orient='y', sobel_kernel=3, thresh=(50, 100))
    mag_binary = mag_thresh(undistTest, sobel_kernel=5, mag_thresh=(30, 100))
    dir_binary = dir_threshold(undistTest, sobel_kernel=7, thresh=(0.7, 1.3))


    color_binary = color_threshold(undistTest,thresh=(160,255))

    combined = np.zeros_like(dir_binary)
    combined[((gradx == 1) & (grady == 1)) | ((mag_binary == 1) & (dir_binary == 1)) | (color_binary == 1)] = 1

    return combined

The get_threshold_image is used for get combined result of gradient+color space.

I used the (50,100) threshould for sobel operator at x and y directions, and (30,100) threshould for the magnitute of the sobel. (160,255) is choosed for the threshoud of the HLS color space.

The code bellow shows the result.

In [312]:
# imageTest = mpimg.imread('perspective_straight.jpg')
imageTest = mpimg.imread('test_images/test2.jpg')
combined = get_threshold_image(imageTest)

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9))
f.tight_layout()
ax1.imshow(imageTest)
ax1.set_title('Original Image', fontsize=50)
ax2.imshow(combined,cmap='gray')
ax2.set_title('Thresholded Image', fontsize=50)
plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)

Perspective Transform

I used the straight line image for testing, then choose the area for perspective transform approximitely. The result shows two lines parallely to each other approximitely, just as we expected.

In [313]:
cv2.line(undistTest, (200, 720), (565, 480), [255,0,0], 2)
cv2.line(undistTest, (1080, 720), (720, 480), [255,0,0], 2)           
plt.imshow(undistTest)
Out[313]:
<matplotlib.image.AxesImage at 0x12809d390>
In [314]:
def get_m_transform():
    src = np.float32([[560, 480], [720, 480],[1080, 720],[200, 720]])
    dst = np.float32([[300, 50], [980, 50],[980, 720],[300, 720]])
    M = cv2.getPerspectiveTransform(src, dst)
    Minv = cv2.getPerspectiveTransform(dst,src)
    return (M,Minv)
In [315]:
def undistort_img(img):
    M = get_m_transform()[0]

    img_size = (img.shape[1], img.shape[0])
    #Warp an image using the perspective transform, M:
    warped = cv2.warpPerspective(img, M, img_size, flags=cv2.INTER_LINEAR)
    return warped
In [316]:
warped = undistort_img(combined)
       
f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9))
f.tight_layout()
ax1.imshow(imageTest)
ax1.set_title('Original Image', fontsize=50)
ax2.imshow(warped,cmap='gray')
ax2.set_title('Undistorted and Warped Image', fontsize=50)
plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)

Filter lane-line pixels

The code bellow is from the sample code from the Udacity lecture

In [317]:
window_width = 100 
window_height = 80 # Break image into 9 vertical layers since image height is 720
margin = 100 # How much to slide left and right for searching

def window_mask(width, height, img_ref, center,level):
    output = np.zeros_like(img_ref)
    output[int(img_ref.shape[0]-(level+1)*height):int(img_ref.shape[0]-level*height),max(0,int(center-width/2)):min(int(center+width/2),img_ref.shape[1])] = 1
    return output

def find_window_centroids(warped, window_width, window_height, margin):
    
    window_centroids = [] # Store the (left,right) window centroid positions per level
    window = np.ones(window_width) # Create our window template that we will use for convolutions
    
    # First find the two starting positions for the left and right lane by using np.sum to get the vertical image slice
    # and then np.convolve the vertical image slice with the window template 
    
    # Sum quarter bottom of image to get slice, could use a different ratio
    l_sum = np.sum(warped[int(3*warped.shape[0]/4):,:int(warped.shape[1]/2)], axis=0)
    l_center = np.argmax(np.convolve(window,l_sum))-window_width/2
    r_sum = np.sum(warped[int(3*warped.shape[0]/4):,int(warped.shape[1]/2):], axis=0)
    r_center = np.argmax(np.convolve(window,r_sum))-window_width/2+int(warped.shape[1]/2)
    
    # Add what we found for the first layer
    window_centroids.append((l_center,r_center))
    
    # Go through each layer looking for max pixel locations
    for level in range(1,(int)(warped.shape[0]/window_height)):
	    # convolve the window into the vertical slice of the image
	    image_layer = np.sum(warped[int(warped.shape[0]-(level+1)*window_height):int(warped.shape[0]-level*window_height),:], axis=0)
	    conv_signal = np.convolve(window, image_layer)
	    # Find the best left centroid by using past left center as a reference
	    # Use window_width/2 as offset because convolution signal reference is at right side of window, not center of window
	    offset = window_width/2
	    l_min_index = int(max(l_center+offset-margin,0))
	    l_max_index = int(min(l_center+offset+margin,warped.shape[1]))
	    l_center = np.argmax(conv_signal[l_min_index:l_max_index])+l_min_index-offset
	    # Find the best right centroid by using past right center as a reference
	    r_min_index = int(max(r_center+offset-margin,0))
	    r_max_index = int(min(r_center+offset+margin,warped.shape[1]))
	    r_center = np.argmax(conv_signal[r_min_index:r_max_index])+r_min_index-offset
	    # Add what we found for that layer
	    window_centroids.append((l_center,r_center))

    return window_centroids

The get_filtered_points will give the filtered result of the lane pixals, which is for the polynomial fitting

In [318]:
def get_filtered_points(img, window_width, window_height, margin):
    window_centroids = find_window_centroids(img, window_width, window_height, margin)
    # If we found any window centers
    if len(window_centroids) > 0:

        # Points used to draw all the left and right windows
        l_points = np.zeros_like(img)
        r_points = np.zeros_like(img)
        l_points_filted = np.zeros_like(img)
        r_points_filted = np.zeros_like(img)

        # Go through each level and draw the windows 	
        for level in range(0,len(window_centroids)):
            # Window_mask is a function to draw window areas
            l_mask = window_mask(window_width,window_height,img,window_centroids[level][0],level)
            r_mask = window_mask(window_width,window_height,img,window_centroids[level][1],level)
            # Add graphic points from window mask here to total pixels found 

            l_points_filted[(img > 0) & ((l_mask == 1) ) ] = 255
            r_points_filted[(img > 0) & ((r_mask == 1) ) ] = 255

            l_points[(l_points == 255) | ((l_mask == 1) ) ] = 255
            r_points[(r_points == 255) | ((r_mask == 1) ) ] = 255
            
    return (l_points_filted,r_points_filted,l_points,r_points)

The code bellow shows the result of result filtered by window template

In [319]:
filtered_points = get_filtered_points(warped, window_width, window_height, margin)
l_points = filtered_points[:][0]
r_points = filtered_points[:][1]

t_l_points = filtered_points[:][2]
t_r_points = filtered_points[:][3]

result = np.array(r_points+l_points,np.uint8)
template = np.array(t_r_points+t_l_points,np.uint8) # add both left and right window pixels together
zero_channel = np.zeros_like(template) # create a zero color channle 
warpp = np.array(warped*255,np.uint8)
template = np.array(cv2.merge((zero_channel,template,zero_channel)),np.uint8) # make window pixels green
warpage = np.array(cv2.merge((warpp,warpp,warpp)),np.uint8) # making the original road pixels 3 color channels
output = cv2.addWeighted(warpage, 1, template, 0.5, 0.0) # overlay the orignal road image with window results

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9))
f.tight_layout()
ax1.imshow(output)
ax1.set_title('window fitting results', fontsize=50)
ax2.imshow(result,cmap='gray')
ax2.set_title('final filtered results', fontsize=50)
plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)

Polynomial fitness

After generate the lane-line pixals, I used the polynomial fit function to get the polynomial parameter of lane-lines

In [320]:
def fit_as_polynome(points):
    curve_points_l_row = []
    curve_points_l_column = []
    curve_points_r_row = []
    curve_points_r_column = []
    for x in range(0,720):
        for y in range(0,1280):
            if points[0][x][y] > 0:
                curve_points_l_row.append(x)
                curve_points_l_column.append(y)
            if points[1][x][y] > 0:
                curve_points_r_row.append(x)
                curve_points_r_column.append(y)

    ploty = np.linspace(0, 719, num=720)
    curve_points_l_row = np.array(curve_points_l_row)
    curve_points_l_column = np.array(curve_points_l_column)
    curve_points_r_row = np.array(curve_points_r_row)
    curve_points_r_column = np.array(curve_points_r_column)
    
        # Fit a second order polynomial to each fake lane line
    left_fit = np.polyfit(curve_points_l_row, curve_points_l_column, 2)
    left_fitx = left_fit[0]*ploty**2 + left_fit[1]*ploty + left_fit[2]
    right_fit = np.polyfit(curve_points_r_row, curve_points_r_column, 2)
    right_fitx = right_fit[0]*ploty**2 + right_fit[1]*ploty + right_fit[2]

    return ((left_fitx,ploty,curve_points_l_row,curve_points_l_column,left_fit),(right_fitx,ploty,curve_points_r_row,curve_points_r_column,right_fit))
    
In [321]:
# Plot up the fake data
polynome_data = fit_as_polynome(filtered_points)
plt.plot(polynome_data[0][3], polynome_data[0][2], 'o', color='red')
plt.plot(polynome_data[1][3], polynome_data[1][2], 'o', color='blue')
plt.xlim(0, 1280)
plt.ylim(0, 720)
plt.plot(polynome_data[0][0], polynome_data[0][1], color='green', linewidth=3)
plt.plot(polynome_data[1][0], polynome_data[1][1], color='green', linewidth=3)
plt.gca().invert_yaxis() # to visualize as we do the images

Measuring Curvature and Offset

The code bellow measures the curvature of the lane-line both in pixals and in real world. The parameter I choosed is:

  • y: 25/720 meters/pixal
  • x: 3.7/700 meters/pixal
In [322]:
def get_polynome_result(polynome_data):
    y_eval = np.max(polynome_data[0][1])
    left_curverad = ((1 + (2*polynome_data[0][4][0]*y_eval + polynome_data[0][4][1])**2)**1.5) \
                                 /np.absolute(2*polynome_data[0][4][0])

    y_eval = np.max(polynome_data[1][1])
    right_curverad = ((1 + (2*polynome_data[1][4][0]*y_eval + polynome_data[1][4][1])**2)**1.5) \
                                    /np.absolute(2*polynome_data[1][4][0])

    # Define conversions in x and y from pixels space to meters
    ym_per_pix = 25/720 # meters per pixel in y dimension
    xm_per_pix = 3.7/700 # meteres per pixel in x dimension

    left_fit_cr = np.polyfit(polynome_data[0][2]*ym_per_pix, polynome_data[0][3]*xm_per_pix, 2)
    right_fit_cr = np.polyfit(polynome_data[1][2]*ym_per_pix, polynome_data[1][3]*xm_per_pix, 2)
    
#     print(polynome_data[0][4])
#     print(polynome_data[1][4])
    
#     print(left_fit_cr)
#     print(right_fit_cr)
    
    y_eval = np.max(polynome_data[0][1]) * ym_per_pix
    left_curverad_world = ((1 + (2*left_fit_cr[0]*y_eval + left_fit_cr[1])**2)**1.5) \
                                 /np.absolute(2*left_fit_cr[0])
    right_curverad_world = ((1 + (2*right_fit_cr[0]*y_eval + right_fit_cr[1])**2)**1.5) \
                                    /np.absolute(2*right_fit_cr[0])
        
#     print(left_curverad_world)
#     print(right_curverad_world)
    # Now our radius of curvature is in meters
    offset = ((polynome_data[0][4][0]*720**2 + polynome_data[0][4][1]*720 + polynome_data[0][4][2]) + (polynome_data[1][4][0]*720**2 + polynome_data[1][4][1]*720 + polynome_data[1][4][2])) / 2 - (1280/2) 
    
    offset_world = offset * xm_per_pix
    
    return (left_curverad,right_curverad,left_curverad_world,right_curverad_world,offset,offset_world)
In [323]:
polynome_result = get_polynome_result(polynome_data)
print(polynome_result[0], polynome_result[1])
print(polynome_result[2], 'm', polynome_result[3], 'm')
print(polynome_result[4], polynome_result[5], 'm')
2124.56763045 4344.26708937
484.081941158 m 959.73925503 m
70.7923342482 0.374188052455 m

Merge back to original image

In [269]:
def merge_inv_back_to_img(image, warped_img, data, inverse_m):
    # Create an image to draw the lines on
    warp_zero = np.zeros_like(warped_img).astype(np.uint8)
    color_warp = np.dstack((warp_zero, warp_zero, warp_zero))

    # Recast the x and y points into usable format for cv2.fillPoly()
    pts_left = np.array([np.transpose(np.vstack([data[0][0], data[0][1]]))])
    pts_right = np.array([np.flipud(np.transpose(np.vstack([data[1][0], data[1][1]])))])
    pts = np.hstack((pts_left, pts_right))


    # Draw the lane onto the warped blank image
    cv2.fillPoly(color_warp, np.int_([pts]), (0,255, 0))
    # Warp the blank back to original image space using inverse perspective matrix (Minv)
    newwarp = cv2.warpPerspective(color_warp, inverse_m, (image.shape[1], image.shape[0])) 
    # Combine the result with the original image
    result = cv2.addWeighted(image, 1, newwarp, 0.3, 0)
    return result
    
In [270]:
Minv = get_m_transform()[1]
result_img = merge_inv_back_to_img(imageTest, warped, polynome_data, Minv)
plt.imshow(result_img)
Out[270]:
<matplotlib.image.AxesImage at 0x12192b908>

Final Code

I filtered the result by average recent 10 iterations, and dropout ones that looks like invalid.

If the curvature of left and right lane lines looks like:

  1. Similar curvature
  2. Separated by approximately the right distance horizontally
  3. Roughly parallel

by comparing their polynomial parameters, I'll decide it as a valid result. The radius of the curvation is the average result of the left and right lane-lines

In [271]:
n_iters = 10
In [272]:
class Line():
    def __init__(self):
        # was the line detected in the last iteration?
        self.detected = False  
        # x values of the last n fits of the line
        self.recent_xfitted = [] 
        # polynomial coefficients of lastn iterations
        self.recent_fit = [[np.array([False])]]
        #average x values of the fitted line over the last n iterations
        self.bestx = None     
        #polynomial coefficients averaged over the last n iterations
        self.best_fit = None  
        #polynomial coefficients for the most recent fit
        self.current_fit = [np.array([False])]  
        #radius of curvature of the line in some units
        self.radius_of_curvature = None 
        #distance in meters of vehicle center from the line
        self.line_base_pos = None 
        #difference in fit coefficients between last and new fits
        self.diffs = np.array([0,0,0], dtype='float') 
        #x values for detected line pixels
        self.allx = None  
        #y values for detected line pixels
        self.ally = None
        
    def update_line(self):
        self.recent_xfitted.append(self.allx)
        self.recent_fit.append(self.current_fit)
        
        if len(self.recent_xfitted) > n_iters:
            self.recent_xfitted.remove(self.recent_xfitted[0])
            
        if len(self.recent_fit) > n_iters:
            self.recent_fit.remove(self.recent_fit[0])
            
        self.bestx = sum(self.recent_xfitted)/n_iters
#         self.best_fit = sum(self.recent_fit)/n_iters
        
#         print(self.allx.shape)
#         print(self.bestx.shape)
        
            
        
        
In [273]:
left_line = Line()
right_line = Line()
In [274]:
def is_valid_line(l_line, r_line):
    dif_c1 = abs(l_line.current_fit[0] - r_line.current_fit[0])
    dif_c2 = abs(l_line.current_fit[1] - r_line.current_fit[1])
    dif_c3 = abs(l_line.current_fit[2] - r_line.current_fit[2])
    if (dif_c1 < 0.001) & (dif_c2 < 0.5) & (dif_c3 < 900) & (dif_c3 > 500):
        return True
    else:
        return False
    
In [335]:
def process_image(image):
    threshould_img = get_threshold_image(image)
    warped_img = undistort_img(threshould_img)
    
    window_width = 100 
    window_height = 80 # Break image into 9 vertical layers since image height is 720
    margin = 100 # How much to slide left and right for searching

    filtered_result = get_filtered_points(warped_img, window_width, window_height, margin)
    
    data = fit_as_polynome(filtered_result)
    
    p_result = get_polynome_result(data)
    
    result_s = "Radius is %.1f m, and %f m left of the center"% ((p_result[2]+p_result[3])/2,p_result[5])
#     print(result_s)
    
    left_line.current_fit = data[0][4]
    left_line.allx = data[0][0]
    left_line.ally = data[0][1]
    
    right_line.current_fit = data[1][4]
    right_line.allx = data[1][0]
    right_line.ally = data[1][1]
    
    if is_valid_line(left_line, right_line):
        left_line.update_line()
        right_line.update_line()
        
    Minv = get_m_transform()[1]

    if len(left_line.recent_xfitted) < n_iters:
        format_data = ((left_line.allx,left_line.ally),(right_line.allx,right_line.ally))
    else:   
        format_data = ((left_line.bestx,left_line.ally),(right_line.bestx,right_line.ally))
    
    result_img = merge_inv_back_to_img(image, warped_img, format_data, Minv)
    
    # Write some Text
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(result_img,result_s,(100,100), font, 1,(255,255,255),2)
    return result_img
In [336]:
left_line = Line()
right_line = Line()
imageTest = mpimg.imread('test_images/test1.jpg')
imageResult = process_image(imageTest)
plt.imshow(imageResult)
Out[336]:
<matplotlib.image.AxesImage at 0x125798860>
In [337]:
from moviepy.editor import VideoFileClip

output = 'output.mp4'
clip1 = VideoFileClip("project_video.mp4")
output_clip = clip1.fl_image(process_image) #NOTE: this function expects color images!!
%time output_clip.write_videofile(output, audio=False)
[MoviePy] >>>> Building video output.mp4
[MoviePy] Writing video output.mp4
  0%|          | 0/1261 [00:00<?, ?it/s]
  0%|          | 1/1261 [00:01<22:28,  1.07s/it]
  0%|          | 2/1261 [00:02<22:42,  1.08s/it]
  0%|          | 3/1261 [00:03<23:01,  1.10s/it]
  0%|          | 4/1261 [00:04<23:02,  1.10s/it]
  0%|          | 5/1261 [00:05<23:22,  1.12s/it]
  0%|          | 6/1261 [00:06<23:08,  1.11s/it]
  1%|          | 7/1261 [00:07<23:04,  1.10s/it]
  1%|          | 8/1261 [00:08<22:56,  1.10s/it]
  1%|          | 9/1261 [00:09<22:43,  1.09s/it]
  1%|          | 10/1261 [00:10<22:35,  1.08s/it]
  1%|          | 11/1261 [00:12<22:34,  1.08s/it]
  1%|          | 12/1261 [00:13<22:31,  1.08s/it]
  1%|          | 13/1261 [00:14<22:25,  1.08s/it]
  1%|          | 14/1261 [00:15<22:24,  1.08s/it]
  1%|          | 15/1261 [00:16<22:23,  1.08s/it]
  1%|▏         | 16/1261 [00:17<22:30,  1.08s/it]
  1%|▏         | 17/1261 [00:18<22:27,  1.08s/it]
  1%|▏         | 18/1261 [00:19<22:26,  1.08s/it]
  2%|▏         | 19/1261 [00:20<22:47,  1.10s/it]
  2%|▏         | 20/1261 [00:21<22:51,  1.11s/it]
  2%|▏         | 21/1261 [00:22<22:49,  1.10s/it]
  2%|▏         | 22/1261 [00:24<23:03,  1.12s/it]
  2%|▏         | 23/1261 [00:25<23:47,  1.15s/it]
  2%|▏         | 24/1261 [00:26<23:34,  1.14s/it]
  2%|▏         | 25/1261 [00:27<24:03,  1.17s/it]
  2%|▏         | 26/1261 [00:28<23:51,  1.16s/it]
  2%|▏         | 27/1261 [00:30<24:07,  1.17s/it]
  2%|▏         | 28/1261 [00:31<23:36,  1.15s/it]
  2%|▏         | 29/1261 [00:32<24:08,  1.18s/it]
  2%|▏         | 30/1261 [00:33<24:11,  1.18s/it]
  2%|▏         | 31/1261 [00:34<23:54,  1.17s/it]
  3%|▎         | 32/1261 [00:35<23:27,  1.15s/it]
  3%|▎         | 33/1261 [00:36<23:12,  1.13s/it]
  3%|▎         | 34/1261 [00:38<23:17,  1.14s/it]
  3%|▎         | 35/1261 [00:39<23:32,  1.15s/it]
  3%|▎         | 36/1261 [00:40<23:18,  1.14s/it]
  3%|▎         | 37/1261 [00:41<23:12,  1.14s/it]
  3%|▎         | 38/1261 [00:42<23:07,  1.13s/it]
  3%|▎         | 39/1261 [00:43<22:59,  1.13s/it]
  3%|▎         | 40/1261 [00:44<23:34,  1.16s/it]
  3%|▎         | 41/1261 [00:46<23:50,  1.17s/it]
  3%|▎         | 42/1261 [00:47<23:30,  1.16s/it]
  3%|▎         | 43/1261 [00:48<23:52,  1.18s/it]
  3%|▎         | 44/1261 [00:49<23:49,  1.17s/it]
  4%|▎         | 45/1261 [00:50<23:29,  1.16s/it]
  4%|▎         | 46/1261 [00:51<23:05,  1.14s/it]
  4%|▎         | 47/1261 [00:53<22:52,  1.13s/it]
  4%|▍         | 48/1261 [00:54<22:41,  1.12s/it]
  4%|▍         | 49/1261 [00:55<22:26,  1.11s/it]
  4%|▍         | 50/1261 [00:56<22:25,  1.11s/it]
  4%|▍         | 51/1261 [00:57<22:20,  1.11s/it]
  4%|▍         | 52/1261 [00:58<22:47,  1.13s/it]
  4%|▍         | 53/1261 [00:59<23:03,  1.15s/it]
  4%|▍         | 54/1261 [01:01<23:34,  1.17s/it]
  4%|▍         | 55/1261 [01:02<23:13,  1.16s/it]
  4%|▍         | 56/1261 [01:03<23:27,  1.17s/it]
  5%|▍         | 57/1261 [01:04<23:04,  1.15s/it]
  5%|▍         | 58/1261 [01:05<23:32,  1.17s/it]
  5%|▍         | 59/1261 [01:06<24:24,  1.22s/it]
  5%|▍         | 60/1261 [01:08<24:24,  1.22s/it]
  5%|▍         | 61/1261 [01:09<24:01,  1.20s/it]
  5%|▍         | 62/1261 [01:10<24:04,  1.20s/it]
  5%|▍         | 63/1261 [01:11<23:39,  1.18s/it]
  5%|▌         | 64/1261 [01:12<23:10,  1.16s/it]
  5%|▌         | 65/1261 [01:13<23:06,  1.16s/it]
  5%|▌         | 66/1261 [01:15<23:03,  1.16s/it]
  5%|▌         | 67/1261 [01:16<23:21,  1.17s/it]
  5%|▌         | 68/1261 [01:17<23:33,  1.19s/it]
  5%|▌         | 69/1261 [01:18<23:13,  1.17s/it]
  6%|▌         | 70/1261 [01:19<22:42,  1.14s/it]
  6%|▌         | 71/1261 [01:20<22:48,  1.15s/it]
  6%|▌         | 72/1261 [01:22<22:28,  1.13s/it]
  6%|▌         | 73/1261 [01:23<22:39,  1.14s/it]
  6%|▌         | 74/1261 [01:24<22:25,  1.13s/it]
  6%|▌         | 75/1261 [01:25<22:04,  1.12s/it]
  6%|▌         | 76/1261 [01:26<21:43,  1.10s/it]
  6%|▌         | 77/1261 [01:27<21:27,  1.09s/it]
  6%|▌         | 78/1261 [01:28<21:26,  1.09s/it]
  6%|▋         | 79/1261 [01:29<22:32,  1.14s/it]
  6%|▋         | 80/1261 [01:31<22:42,  1.15s/it]
  6%|▋         | 81/1261 [01:32<22:45,  1.16s/it]
  7%|▋         | 82/1261 [01:33<22:54,  1.17s/it]
  7%|▋         | 83/1261 [01:34<22:30,  1.15s/it]
  7%|▋         | 84/1261 [01:35<22:08,  1.13s/it]
  7%|▋         | 85/1261 [01:36<21:48,  1.11s/it]
  7%|▋         | 86/1261 [01:37<21:33,  1.10s/it]
  7%|▋         | 87/1261 [01:38<21:29,  1.10s/it]
  7%|▋         | 88/1261 [01:40<22:02,  1.13s/it]
  7%|▋         | 89/1261 [01:41<21:48,  1.12s/it]
  7%|▋         | 90/1261 [01:42<21:37,  1.11s/it]
  7%|▋         | 91/1261 [01:43<21:23,  1.10s/it]
  7%|▋         | 92/1261 [01:44<21:17,  1.09s/it]
  7%|▋         | 93/1261 [01:45<21:09,  1.09s/it]
  7%|▋         | 94/1261 [01:46<20:56,  1.08s/it]
  8%|▊         | 95/1261 [01:47<20:50,  1.07s/it]
  8%|▊         | 96/1261 [01:48<20:47,  1.07s/it]
  8%|▊         | 97/1261 [01:49<20:45,  1.07s/it]
  8%|▊         | 98/1261 [01:50<20:41,  1.07s/it]
  8%|▊         | 99/1261 [01:51<20:40,  1.07s/it]
  8%|▊         | 100/1261 [01:52<20:48,  1.08s/it]
  8%|▊         | 101/1261 [01:53<20:49,  1.08s/it]
  8%|▊         | 102/1261 [01:55<21:00,  1.09s/it]
  8%|▊         | 103/1261 [01:56<20:58,  1.09s/it]
  8%|▊         | 104/1261 [01:57<20:52,  1.08s/it]
  8%|▊         | 105/1261 [01:58<20:52,  1.08s/it]
  8%|▊         | 106/1261 [01:59<20:59,  1.09s/it]
  8%|▊         | 107/1261 [02:00<20:57,  1.09s/it]
  9%|▊         | 108/1261 [02:01<20:54,  1.09s/it]
  9%|▊         | 109/1261 [02:02<20:49,  1.08s/it]
  9%|▊         | 110/1261 [02:03<20:43,  1.08s/it]
  9%|▉         | 111/1261 [02:04<20:46,  1.08s/it]
  9%|▉         | 112/1261 [02:05<20:42,  1.08s/it]
  9%|▉         | 113/1261 [02:07<20:38,  1.08s/it]
  9%|▉         | 114/1261 [02:08<20:39,  1.08s/it]
  9%|▉         | 115/1261 [02:09<20:37,  1.08s/it]
  9%|▉         | 116/1261 [02:10<20:36,  1.08s/it]
  9%|▉         | 117/1261 [02:11<20:32,  1.08s/it]
  9%|▉         | 118/1261 [02:12<20:28,  1.08s/it]
  9%|▉         | 119/1261 [02:13<20:25,  1.07s/it]
 10%|▉         | 120/1261 [02:14<20:27,  1.08s/it]
 10%|▉         | 121/1261 [02:15<20:24,  1.07s/it]
 10%|▉         | 122/1261 [02:16<20:18,  1.07s/it]
 10%|▉         | 123/1261 [02:17<20:19,  1.07s/it]
 10%|▉         | 124/1261 [02:18<20:14,  1.07s/it]
 10%|▉         | 125/1261 [02:19<20:19,  1.07s/it]
 10%|▉         | 126/1261 [02:20<20:14,  1.07s/it]
 10%|█         | 127/1261 [02:22<20:09,  1.07s/it]
 10%|█         | 128/1261 [02:23<20:07,  1.07s/it]
 10%|█         | 129/1261 [02:24<20:09,  1.07s/it]
 10%|█         | 130/1261 [02:25<20:15,  1.07s/it]
 10%|█         | 131/1261 [02:26<20:07,  1.07s/it]
 10%|█         | 132/1261 [02:27<20:06,  1.07s/it]
 11%|█         | 133/1261 [02:28<20:09,  1.07s/it]
 11%|█         | 134/1261 [02:29<20:08,  1.07s/it]
 11%|█         | 135/1261 [02:30<20:04,  1.07s/it]
 11%|█         | 136/1261 [02:31<19:59,  1.07s/it]
 11%|█         | 137/1261 [02:32<19:58,  1.07s/it]
 11%|█         | 138/1261 [02:33<20:03,  1.07s/it]
 11%|█         | 139/1261 [02:34<20:06,  1.08s/it]
 11%|█         | 140/1261 [02:35<20:04,  1.07s/it]
 11%|█         | 141/1261 [02:37<19:56,  1.07s/it]
 11%|█▏        | 142/1261 [02:38<19:57,  1.07s/it]
 11%|█▏        | 143/1261 [02:39<19:59,  1.07s/it]
 11%|█▏        | 144/1261 [02:40<19:56,  1.07s/it]
 11%|█▏        | 145/1261 [02:41<19:58,  1.07s/it]
 12%|█▏        | 146/1261 [02:42<19:54,  1.07s/it]
 12%|█▏        | 147/1261 [02:43<19:49,  1.07s/it]
 12%|█▏        | 148/1261 [02:44<19:34,  1.05s/it]
 12%|█▏        | 149/1261 [02:45<19:41,  1.06s/it]
 12%|█▏        | 150/1261 [02:46<19:39,  1.06s/it]
 12%|█▏        | 151/1261 [02:47<19:40,  1.06s/it]
 12%|█▏        | 152/1261 [02:48<19:35,  1.06s/it]
 12%|█▏        | 153/1261 [02:49<19:35,  1.06s/it]
 12%|█▏        | 154/1261 [02:50<19:37,  1.06s/it]
 12%|█▏        | 155/1261 [02:51<19:37,  1.07s/it]
 12%|█▏        | 156/1261 [02:52<19:38,  1.07s/it]
 12%|█▏        | 157/1261 [02:54<19:38,  1.07s/it]
 13%|█▎        | 158/1261 [02:55<19:42,  1.07s/it]
 13%|█▎        | 159/1261 [02:56<19:43,  1.07s/it]
 13%|█▎        | 160/1261 [02:57<19:42,  1.07s/it]
 13%|█▎        | 161/1261 [02:58<19:37,  1.07s/it]
 13%|█▎        | 162/1261 [02:59<19:35,  1.07s/it]
 13%|█▎        | 163/1261 [03:00<19:35,  1.07s/it]
 13%|█▎        | 164/1261 [03:01<19:33,  1.07s/it]
 13%|█▎        | 165/1261 [03:02<19:34,  1.07s/it]
 13%|█▎        | 166/1261 [03:03<19:40,  1.08s/it]
 13%|█▎        | 167/1261 [03:04<19:37,  1.08s/it]
 13%|█▎        | 168/1261 [03:05<19:31,  1.07s/it]
 13%|█▎        | 169/1261 [03:06<19:20,  1.06s/it]
 13%|█▎        | 170/1261 [03:07<19:16,  1.06s/it]
 14%|█▎        | 171/1261 [03:09<19:19,  1.06s/it]
 14%|█▎        | 172/1261 [03:10<19:15,  1.06s/it]
 14%|█▎        | 173/1261 [03:11<19:09,  1.06s/it]
 14%|█▍        | 174/1261 [03:12<19:09,  1.06s/it]
 14%|█▍        | 175/1261 [03:13<19:23,  1.07s/it]
 14%|█▍        | 176/1261 [03:14<19:19,  1.07s/it]
 14%|█▍        | 177/1261 [03:15<19:19,  1.07s/it]
 14%|█▍        | 178/1261 [03:16<19:20,  1.07s/it]
 14%|█▍        | 179/1261 [03:17<19:17,  1.07s/it]
 14%|█▍        | 180/1261 [03:18<19:17,  1.07s/it]
 14%|█▍        | 181/1261 [03:19<19:12,  1.07s/it]
 14%|█▍        | 182/1261 [03:20<19:10,  1.07s/it]
 15%|█▍        | 183/1261 [03:21<19:14,  1.07s/it]
 15%|█▍        | 184/1261 [03:22<19:14,  1.07s/it]
 15%|█▍        | 185/1261 [03:23<19:10,  1.07s/it]
 15%|█▍        | 186/1261 [03:25<19:29,  1.09s/it]
 15%|█▍        | 187/1261 [03:26<19:30,  1.09s/it]
 15%|█▍        | 188/1261 [03:27<19:38,  1.10s/it]
 15%|█▍        | 189/1261 [03:28<19:34,  1.10s/it]
 15%|█▌        | 190/1261 [03:29<19:26,  1.09s/it]
 15%|█▌        | 191/1261 [03:30<19:32,  1.10s/it]
 15%|█▌        | 192/1261 [03:31<19:19,  1.08s/it]
 15%|█▌        | 193/1261 [03:32<19:31,  1.10s/it]
 15%|█▌        | 194/1261 [03:33<19:41,  1.11s/it]
 15%|█▌        | 195/1261 [03:35<19:37,  1.10s/it]
 16%|█▌        | 196/1261 [03:36<19:29,  1.10s/it]
 16%|█▌        | 197/1261 [03:37<19:30,  1.10s/it]
 16%|█▌        | 198/1261 [03:38<19:28,  1.10s/it]
 16%|█▌        | 199/1261 [03:39<19:19,  1.09s/it]
 16%|█▌        | 200/1261 [03:40<19:11,  1.09s/it]
 16%|█▌        | 201/1261 [03:41<19:03,  1.08s/it]
 16%|█▌        | 202/1261 [03:42<19:07,  1.08s/it]
 16%|█▌        | 203/1261 [03:43<19:14,  1.09s/it]
 16%|█▌        | 204/1261 [03:44<19:12,  1.09s/it]
 16%|█▋        | 205/1261 [03:45<19:13,  1.09s/it]
 16%|█▋        | 206/1261 [03:46<19:07,  1.09s/it]
 16%|█▋        | 207/1261 [03:48<19:02,  1.08s/it]
 16%|█▋        | 208/1261 [03:49<18:56,  1.08s/it]
 17%|█▋        | 209/1261 [03:50<19:00,  1.08s/it]
 17%|█▋        | 210/1261 [03:51<19:00,  1.09s/it]
 17%|█▋        | 211/1261 [03:52<19:03,  1.09s/it]
 17%|█▋        | 212/1261 [03:53<19:05,  1.09s/it]
 17%|█▋        | 213/1261 [03:54<19:27,  1.11s/it]
 17%|█▋        | 214/1261 [03:55<19:24,  1.11s/it]
 17%|█▋        | 215/1261 [03:56<19:13,  1.10s/it]
 17%|█▋        | 216/1261 [03:58<19:44,  1.13s/it]
 17%|█▋        | 217/1261 [03:59<20:21,  1.17s/it]
 17%|█▋        | 218/1261 [04:00<19:50,  1.14s/it]
 17%|█▋        | 219/1261 [04:01<19:27,  1.12s/it]
 17%|█▋        | 220/1261 [04:02<19:11,  1.11s/it]
 18%|█▊        | 221/1261 [04:03<18:56,  1.09s/it]
 18%|█▊        | 222/1261 [04:04<18:52,  1.09s/it]
 18%|█▊        | 223/1261 [04:05<19:00,  1.10s/it]
 18%|█▊        | 224/1261 [04:06<19:06,  1.11s/it]
 18%|█▊        | 225/1261 [04:08<19:55,  1.15s/it]
 18%|█▊        | 226/1261 [04:09<19:51,  1.15s/it]
 18%|█▊        | 227/1261 [04:10<19:38,  1.14s/it]
 18%|█▊        | 228/1261 [04:11<19:39,  1.14s/it]
 18%|█▊        | 229/1261 [04:12<19:34,  1.14s/it]
 18%|█▊        | 230/1261 [04:13<19:17,  1.12s/it]
 18%|█▊        | 231/1261 [04:14<19:30,  1.14s/it]
 18%|█▊        | 232/1261 [04:16<19:24,  1.13s/it]
 18%|█▊        | 233/1261 [04:17<19:07,  1.12s/it]
 19%|█▊        | 234/1261 [04:18<19:40,  1.15s/it]
 19%|█▊        | 235/1261 [04:19<19:14,  1.12s/it]
 19%|█▊        | 236/1261 [04:20<18:56,  1.11s/it]
 19%|█▉        | 237/1261 [04:21<18:48,  1.10s/it]
 19%|█▉        | 238/1261 [04:22<19:17,  1.13s/it]
 19%|█▉        | 239/1261 [04:23<19:01,  1.12s/it]
 19%|█▉        | 240/1261 [04:24<18:43,  1.10s/it]
 19%|█▉        | 241/1261 [04:26<18:38,  1.10s/it]
 19%|█▉        | 242/1261 [04:27<18:40,  1.10s/it]
 19%|█▉        | 243/1261 [04:28<18:23,  1.08s/it]
 19%|█▉        | 244/1261 [04:29<18:18,  1.08s/it]
 19%|█▉        | 245/1261 [04:30<18:10,  1.07s/it]
 20%|█▉        | 246/1261 [04:31<18:07,  1.07s/it]
 20%|█▉        | 247/1261 [04:32<17:59,  1.07s/it]
 20%|█▉        | 248/1261 [04:33<18:02,  1.07s/it]
 20%|█▉        | 249/1261 [04:34<18:02,  1.07s/it]
 20%|█▉        | 250/1261 [04:35<18:01,  1.07s/it]
 20%|█▉        | 251/1261 [04:36<18:08,  1.08s/it]
 20%|█▉        | 252/1261 [04:37<17:59,  1.07s/it]
 20%|██        | 253/1261 [04:38<18:00,  1.07s/it]
 20%|██        | 254/1261 [04:40<18:07,  1.08s/it]
 20%|██        | 255/1261 [04:41<18:06,  1.08s/it]
 20%|██        | 256/1261 [04:42<18:24,  1.10s/it]
 20%|██        | 257/1261 [04:43<18:13,  1.09s/it]
 20%|██        | 258/1261 [04:44<18:05,  1.08s/it]
 21%|██        | 259/1261 [04:45<18:17,  1.10s/it]
 21%|██        | 260/1261 [04:46<18:08,  1.09s/it]
 21%|██        | 261/1261 [04:47<17:59,  1.08s/it]
 21%|██        | 262/1261 [04:48<17:53,  1.07s/it]
 21%|██        | 263/1261 [04:49<17:49,  1.07s/it]
 21%|██        | 264/1261 [04:50<17:47,  1.07s/it]
 21%|██        | 265/1261 [04:51<17:46,  1.07s/it]
 21%|██        | 266/1261 [04:52<17:39,  1.07s/it]
 21%|██        | 267/1261 [04:54<17:40,  1.07s/it]
 21%|██▏       | 268/1261 [04:55<17:39,  1.07s/it]
 21%|██▏       | 269/1261 [04:56<17:40,  1.07s/it]
 21%|██▏       | 270/1261 [04:57<17:40,  1.07s/it]
 21%|██▏       | 271/1261 [04:58<17:35,  1.07s/it]
 22%|██▏       | 272/1261 [04:59<17:33,  1.06s/it]
 22%|██▏       | 273/1261 [05:00<17:37,  1.07s/it]
 22%|██▏       | 274/1261 [05:01<17:36,  1.07s/it]
 22%|██▏       | 275/1261 [05:02<17:35,  1.07s/it]
 22%|██▏       | 276/1261 [05:03<17:33,  1.07s/it]
 22%|██▏       | 277/1261 [05:04<17:32,  1.07s/it]
 22%|██▏       | 278/1261 [05:05<17:38,  1.08s/it]
 22%|██▏       | 279/1261 [05:06<17:36,  1.08s/it]
 22%|██▏       | 280/1261 [05:07<17:35,  1.08s/it]
 22%|██▏       | 281/1261 [05:09<17:34,  1.08s/it]
 22%|██▏       | 282/1261 [05:10<17:30,  1.07s/it]
 22%|██▏       | 283/1261 [05:11<17:21,  1.06s/it]
 23%|██▎       | 284/1261 [05:12<17:20,  1.06s/it]
 23%|██▎       | 285/1261 [05:13<17:22,  1.07s/it]
 23%|██▎       | 286/1261 [05:14<17:25,  1.07s/it]
 23%|██▎       | 287/1261 [05:15<17:23,  1.07s/it]
 23%|██▎       | 288/1261 [05:16<17:15,  1.06s/it]
 23%|██▎       | 289/1261 [05:17<17:20,  1.07s/it]
 23%|██▎       | 290/1261 [05:18<17:21,  1.07s/it]
 23%|██▎       | 291/1261 [05:19<17:19,  1.07s/it]
 23%|██▎       | 292/1261 [05:20<17:21,  1.08s/it]
 23%|██▎       | 293/1261 [05:21<17:22,  1.08s/it]
 23%|██▎       | 294/1261 [05:23<17:47,  1.10s/it]
 23%|██▎       | 295/1261 [05:24<17:31,  1.09s/it]
 23%|██▎       | 296/1261 [05:25<17:20,  1.08s/it]
 24%|██▎       | 297/1261 [05:26<17:18,  1.08s/it]
 24%|██▎       | 298/1261 [05:27<17:13,  1.07s/it]
 24%|██▎       | 299/1261 [05:28<17:08,  1.07s/it]
 24%|██▍       | 300/1261 [05:29<17:18,  1.08s/it]
 24%|██▍       | 301/1261 [05:30<17:12,  1.08s/it]
 24%|██▍       | 302/1261 [05:31<17:12,  1.08s/it]
 24%|██▍       | 303/1261 [05:32<17:07,  1.07s/it]
 24%|██▍       | 304/1261 [05:33<16:59,  1.07s/it]
 24%|██▍       | 305/1261 [05:34<17:04,  1.07s/it]
 24%|██▍       | 306/1261 [05:35<17:04,  1.07s/it]
 24%|██▍       | 307/1261 [05:36<16:58,  1.07s/it]
 24%|██▍       | 308/1261 [05:37<16:58,  1.07s/it]
 25%|██▍       | 309/1261 [05:39<16:55,  1.07s/it]
 25%|██▍       | 310/1261 [05:40<16:48,  1.06s/it]
 25%|██▍       | 311/1261 [05:41<16:48,  1.06s/it]
 25%|██▍       | 312/1261 [05:42<16:53,  1.07s/it]
 25%|██▍       | 313/1261 [05:43<16:48,  1.06s/it]
 25%|██▍       | 314/1261 [05:44<16:45,  1.06s/it]
 25%|██▍       | 315/1261 [05:45<16:43,  1.06s/it]
 25%|██▌       | 316/1261 [05:46<16:42,  1.06s/it]
 25%|██▌       | 317/1261 [05:47<16:52,  1.07s/it]
 25%|██▌       | 318/1261 [05:48<16:44,  1.07s/it]
 25%|██▌       | 319/1261 [05:49<16:42,  1.06s/it]
 25%|██▌       | 320/1261 [05:50<16:42,  1.07s/it]
 25%|██▌       | 321/1261 [05:51<16:40,  1.06s/it]
 26%|██▌       | 322/1261 [05:52<16:42,  1.07s/it]
 26%|██▌       | 323/1261 [05:53<16:35,  1.06s/it]
 26%|██▌       | 324/1261 [05:55<16:34,  1.06s/it]
 26%|██▌       | 325/1261 [05:56<16:32,  1.06s/it]
 26%|██▌       | 326/1261 [05:57<16:37,  1.07s/it]
 26%|██▌       | 327/1261 [05:58<16:37,  1.07s/it]
 26%|██▌       | 328/1261 [05:59<16:38,  1.07s/it]
 26%|██▌       | 329/1261 [06:00<16:41,  1.07s/it]
 26%|██▌       | 330/1261 [06:01<16:40,  1.07s/it]
 26%|██▌       | 331/1261 [06:02<16:41,  1.08s/it]
 26%|██▋       | 332/1261 [06:03<16:33,  1.07s/it]
 26%|██▋       | 333/1261 [06:04<16:33,  1.07s/it]
 26%|██▋       | 334/1261 [06:05<16:41,  1.08s/it]
 27%|██▋       | 335/1261 [06:06<16:35,  1.07s/it]
 27%|██▋       | 336/1261 [06:07<16:33,  1.07s/it]
 27%|██▋       | 337/1261 [06:08<16:37,  1.08s/it]
 27%|██▋       | 338/1261 [06:10<16:31,  1.07s/it]
 27%|██▋       | 339/1261 [06:11<16:31,  1.08s/it]
 27%|██▋       | 340/1261 [06:12<16:29,  1.07s/it]
 27%|██▋       | 341/1261 [06:13<16:21,  1.07s/it]
 27%|██▋       | 342/1261 [06:14<16:21,  1.07s/it]
 27%|██▋       | 343/1261 [06:15<16:20,  1.07s/it]
 27%|██▋       | 344/1261 [06:16<16:22,  1.07s/it]
 27%|██▋       | 345/1261 [06:17<16:17,  1.07s/it]
 27%|██▋       | 346/1261 [06:18<16:16,  1.07s/it]
 28%|██▊       | 347/1261 [06:19<16:17,  1.07s/it]
 28%|██▊       | 348/1261 [06:20<16:20,  1.07s/it]
 28%|██▊       | 349/1261 [06:21<16:25,  1.08s/it]
 28%|██▊       | 350/1261 [06:22<16:19,  1.08s/it]
 28%|██▊       | 351/1261 [06:23<16:21,  1.08s/it]
 28%|██▊       | 352/1261 [06:25<16:17,  1.07s/it]
 28%|██▊       | 353/1261 [06:26<16:14,  1.07s/it]
 28%|██▊       | 354/1261 [06:27<16:09,  1.07s/it]
 28%|██▊       | 355/1261 [06:28<16:13,  1.07s/it]
 28%|██▊       | 356/1261 [06:29<16:12,  1.07s/it]
 28%|██▊       | 357/1261 [06:30<16:07,  1.07s/it]
 28%|██▊       | 358/1261 [06:31<16:05,  1.07s/it]
 28%|██▊       | 359/1261 [06:32<16:02,  1.07s/it]
 29%|██▊       | 360/1261 [06:33<15:58,  1.06s/it]
 29%|██▊       | 361/1261 [06:34<15:59,  1.07s/it]
 29%|██▊       | 362/1261 [06:35<15:56,  1.06s/it]
 29%|██▉       | 363/1261 [06:36<15:59,  1.07s/it]
 29%|██▉       | 364/1261 [06:37<15:55,  1.06s/it]
 29%|██▉       | 365/1261 [06:38<15:52,  1.06s/it]
 29%|██▉       | 366/1261 [06:40<15:57,  1.07s/it]
 29%|██▉       | 367/1261 [06:41<15:55,  1.07s/it]
 29%|██▉       | 368/1261 [06:42<15:52,  1.07s/it]
 29%|██▉       | 369/1261 [06:43<15:52,  1.07s/it]
 29%|██▉       | 370/1261 [06:44<15:48,  1.07s/it]
 29%|██▉       | 371/1261 [06:45<15:48,  1.07s/it]
 30%|██▉       | 372/1261 [06:46<16:00,  1.08s/it]
 30%|██▉       | 373/1261 [06:47<15:58,  1.08s/it]
 30%|██▉       | 374/1261 [06:48<15:55,  1.08s/it]
 30%|██▉       | 375/1261 [06:49<15:44,  1.07s/it]
 30%|██▉       | 376/1261 [06:50<15:48,  1.07s/it]
 30%|██▉       | 377/1261 [06:51<15:47,  1.07s/it]
 30%|██▉       | 378/1261 [06:52<15:44,  1.07s/it]
 30%|███       | 379/1261 [06:53<15:43,  1.07s/it]
 30%|███       | 380/1261 [06:54<15:42,  1.07s/it]
 30%|███       | 381/1261 [06:56<15:40,  1.07s/it]
 30%|███       | 382/1261 [06:57<15:37,  1.07s/it]
 30%|███       | 383/1261 [06:58<15:31,  1.06s/it]
 30%|███       | 384/1261 [06:59<15:47,  1.08s/it]
 31%|███       | 385/1261 [07:00<15:38,  1.07s/it]
 31%|███       | 386/1261 [07:01<15:32,  1.07s/it]
 31%|███       | 387/1261 [07:02<15:32,  1.07s/it]
 31%|███       | 388/1261 [07:03<15:29,  1.06s/it]
 31%|███       | 389/1261 [07:04<15:33,  1.07s/it]
 31%|███       | 390/1261 [07:05<15:33,  1.07s/it]
 31%|███       | 391/1261 [07:06<15:30,  1.07s/it]
 31%|███       | 392/1261 [07:07<15:31,  1.07s/it]
 31%|███       | 393/1261 [07:08<15:25,  1.07s/it]
 31%|███       | 394/1261 [07:09<15:25,  1.07s/it]
 31%|███▏      | 395/1261 [07:11<15:25,  1.07s/it]
 31%|███▏      | 396/1261 [07:12<15:22,  1.07s/it]
 31%|███▏      | 397/1261 [07:13<15:21,  1.07s/it]
 32%|███▏      | 398/1261 [07:14<15:27,  1.08s/it]
 32%|███▏      | 399/1261 [07:15<15:29,  1.08s/it]
 32%|███▏      | 400/1261 [07:16<15:31,  1.08s/it]
 32%|███▏      | 401/1261 [07:17<15:23,  1.07s/it]
 32%|███▏      | 402/1261 [07:18<15:18,  1.07s/it]
 32%|███▏      | 403/1261 [07:19<15:20,  1.07s/it]
 32%|███▏      | 404/1261 [07:20<15:13,  1.07s/it]
 32%|███▏      | 405/1261 [07:21<15:09,  1.06s/it]
 32%|███▏      | 406/1261 [07:22<15:04,  1.06s/it]
 32%|███▏      | 407/1261 [07:23<15:08,  1.06s/it]
 32%|███▏      | 408/1261 [07:24<15:01,  1.06s/it]
 32%|███▏      | 409/1261 [07:25<15:05,  1.06s/it]
 33%|███▎      | 410/1261 [07:27<15:05,  1.06s/it]
 33%|███▎      | 411/1261 [07:28<15:04,  1.06s/it]
 33%|███▎      | 412/1261 [07:29<15:04,  1.06s/it]
 33%|███▎      | 413/1261 [07:30<15:03,  1.07s/it]
 33%|███▎      | 414/1261 [07:31<15:01,  1.06s/it]
 33%|███▎      | 415/1261 [07:32<14:59,  1.06s/it]
 33%|███▎      | 416/1261 [07:33<14:59,  1.06s/it]
 33%|███▎      | 417/1261 [07:34<14:58,  1.06s/it]
 33%|███▎      | 418/1261 [07:35<14:59,  1.07s/it]
 33%|███▎      | 419/1261 [07:36<14:59,  1.07s/it]
 33%|███▎      | 420/1261 [07:37<14:58,  1.07s/it]
 33%|███▎      | 421/1261 [07:38<15:00,  1.07s/it]
 33%|███▎      | 422/1261 [07:39<14:58,  1.07s/it]
 34%|███▎      | 423/1261 [07:40<14:56,  1.07s/it]
 34%|███▎      | 424/1261 [07:41<14:48,  1.06s/it]
 34%|███▎      | 425/1261 [07:43<14:49,  1.06s/it]
 34%|███▍      | 426/1261 [07:44<14:49,  1.07s/it]
 34%|███▍      | 427/1261 [07:45<14:46,  1.06s/it]
 34%|███▍      | 428/1261 [07:46<14:44,  1.06s/it]
 34%|███▍      | 429/1261 [07:47<14:53,  1.07s/it]
 34%|███▍      | 430/1261 [07:48<14:51,  1.07s/it]
 34%|███▍      | 431/1261 [07:49<14:50,  1.07s/it]
 34%|███▍      | 432/1261 [07:50<14:45,  1.07s/it]
 34%|███▍      | 433/1261 [07:51<14:56,  1.08s/it]
 34%|███▍      | 434/1261 [07:52<14:54,  1.08s/it]
 34%|███▍      | 435/1261 [07:53<14:48,  1.08s/it]
 35%|███▍      | 436/1261 [07:54<14:45,  1.07s/it]
 35%|███▍      | 437/1261 [07:55<14:45,  1.07s/it]
 35%|███▍      | 438/1261 [07:56<14:45,  1.08s/it]
 35%|███▍      | 439/1261 [07:58<14:45,  1.08s/it]
 35%|███▍      | 440/1261 [07:59<14:43,  1.08s/it]
 35%|███▍      | 441/1261 [08:00<14:37,  1.07s/it]
 35%|███▌      | 442/1261 [08:01<14:32,  1.07s/it]
 35%|███▌      | 443/1261 [08:02<14:36,  1.07s/it]
 35%|███▌      | 444/1261 [08:03<14:31,  1.07s/it]
 35%|███▌      | 445/1261 [08:04<14:38,  1.08s/it]
 35%|███▌      | 446/1261 [08:05<14:34,  1.07s/it]
 35%|███▌      | 447/1261 [08:06<14:32,  1.07s/it]
 36%|███▌      | 448/1261 [08:07<14:30,  1.07s/it]
 36%|███▌      | 449/1261 [08:08<14:33,  1.08s/it]
 36%|███▌      | 450/1261 [08:09<14:32,  1.08s/it]
 36%|███▌      | 451/1261 [08:10<14:29,  1.07s/it]
 36%|███▌      | 452/1261 [08:11<14:26,  1.07s/it]
 36%|███▌      | 453/1261 [08:13<14:26,  1.07s/it]
 36%|███▌      | 454/1261 [08:14<14:19,  1.07s/it]
 36%|███▌      | 455/1261 [08:15<14:18,  1.07s/it]
 36%|███▌      | 456/1261 [08:16<14:21,  1.07s/it]
 36%|███▌      | 457/1261 [08:17<14:18,  1.07s/it]
 36%|███▋      | 458/1261 [08:18<14:22,  1.07s/it]
 36%|███▋      | 459/1261 [08:19<14:17,  1.07s/it]
 36%|███▋      | 460/1261 [08:20<14:11,  1.06s/it]
 37%|███▋      | 461/1261 [08:21<14:09,  1.06s/it]
 37%|███▋      | 462/1261 [08:22<14:12,  1.07s/it]
 37%|███▋      | 463/1261 [08:23<14:10,  1.07s/it]
 37%|███▋      | 464/1261 [08:24<14:09,  1.07s/it]
 37%|███▋      | 465/1261 [08:25<14:06,  1.06s/it]
 37%|███▋      | 466/1261 [08:26<14:02,  1.06s/it]
 37%|███▋      | 467/1261 [08:27<14:04,  1.06s/it]
 37%|███▋      | 468/1261 [08:29<14:07,  1.07s/it]
 37%|███▋      | 469/1261 [08:30<14:07,  1.07s/it]
 37%|███▋      | 470/1261 [08:31<14:03,  1.07s/it]
 37%|███▋      | 471/1261 [08:32<14:04,  1.07s/it]
 37%|███▋      | 472/1261 [08:33<13:59,  1.06s/it]
 38%|███▊      | 473/1261 [08:34<13:59,  1.07s/it]
 38%|███▊      | 474/1261 [08:35<14:06,  1.08s/it]
 38%|███▊      | 475/1261 [08:36<14:02,  1.07s/it]
 38%|███▊      | 476/1261 [08:37<13:57,  1.07s/it]
 38%|███▊      | 477/1261 [08:38<13:54,  1.06s/it]
 38%|███▊      | 478/1261 [08:39<13:54,  1.07s/it]
 38%|███▊      | 479/1261 [08:40<13:51,  1.06s/it]
 38%|███▊      | 480/1261 [08:41<13:50,  1.06s/it]
 38%|███▊      | 481/1261 [08:42<13:48,  1.06s/it]
 38%|███▊      | 482/1261 [08:43<13:50,  1.07s/it]
 38%|███▊      | 483/1261 [08:45<13:52,  1.07s/it]
 38%|███▊      | 484/1261 [08:46<13:51,  1.07s/it]
 38%|███▊      | 485/1261 [08:47<13:50,  1.07s/it]
 39%|███▊      | 486/1261 [08:48<13:48,  1.07s/it]
 39%|███▊      | 487/1261 [08:49<13:47,  1.07s/it]
 39%|███▊      | 488/1261 [08:50<13:51,  1.08s/it]
 39%|███▉      | 489/1261 [08:51<13:46,  1.07s/it]
 39%|███▉      | 490/1261 [08:52<13:53,  1.08s/it]
 39%|███▉      | 491/1261 [08:53<14:01,  1.09s/it]
 39%|███▉      | 492/1261 [08:54<13:58,  1.09s/it]
 39%|███▉      | 493/1261 [08:55<13:58,  1.09s/it]
 39%|███▉      | 494/1261 [08:56<13:52,  1.09s/it]
 39%|███▉      | 495/1261 [08:58<13:55,  1.09s/it]
 39%|███▉      | 496/1261 [08:59<13:50,  1.09s/it]
 39%|███▉      | 497/1261 [09:00<13:44,  1.08s/it]
 39%|███▉      | 498/1261 [09:01<13:40,  1.07s/it]
 40%|███▉      | 499/1261 [09:02<13:37,  1.07s/it]
 40%|███▉      | 500/1261 [09:03<13:33,  1.07s/it]
 40%|███▉      | 501/1261 [09:04<13:36,  1.07s/it]
 40%|███▉      | 502/1261 [09:05<13:33,  1.07s/it]
 40%|███▉      | 503/1261 [09:06<13:31,  1.07s/it]
 40%|███▉      | 504/1261 [09:07<13:31,  1.07s/it]
 40%|████      | 505/1261 [09:08<13:30,  1.07s/it]
 40%|████      | 506/1261 [09:09<13:29,  1.07s/it]
 40%|████      | 507/1261 [09:10<13:39,  1.09s/it]
 40%|████      | 508/1261 [09:12<13:34,  1.08s/it]
 40%|████      | 509/1261 [09:13<13:29,  1.08s/it]
 40%|████      | 510/1261 [09:14<13:25,  1.07s/it]
 41%|████      | 511/1261 [09:15<13:24,  1.07s/it]
 41%|████      | 512/1261 [09:16<13:22,  1.07s/it]
 41%|████      | 513/1261 [09:17<13:18,  1.07s/it]
 41%|████      | 514/1261 [09:18<13:23,  1.08s/it]
 41%|████      | 515/1261 [09:19<13:22,  1.08s/it]
 41%|████      | 516/1261 [09:20<13:19,  1.07s/it]
 41%|████      | 517/1261 [09:21<13:17,  1.07s/it]
 41%|████      | 518/1261 [09:22<13:17,  1.07s/it]
 41%|████      | 519/1261 [09:23<13:14,  1.07s/it]
 41%|████      | 520/1261 [09:24<13:11,  1.07s/it]
 41%|████▏     | 521/1261 [09:25<13:07,  1.06s/it]
 41%|████▏     | 522/1261 [09:26<13:05,  1.06s/it]
 41%|████▏     | 523/1261 [09:28<13:02,  1.06s/it]
 42%|████▏     | 524/1261 [09:29<13:01,  1.06s/it]
 42%|████▏     | 525/1261 [09:30<13:01,  1.06s/it]
 42%|████▏     | 526/1261 [09:31<13:03,  1.07s/it]
 42%|████▏     | 527/1261 [09:32<13:21,  1.09s/it]
 42%|████▏     | 528/1261 [09:33<13:15,  1.09s/it]
 42%|████▏     | 529/1261 [09:34<13:26,  1.10s/it]
 42%|████▏     | 530/1261 [09:35<13:16,  1.09s/it]
 42%|████▏     | 531/1261 [09:36<13:16,  1.09s/it]
 42%|████▏     | 532/1261 [09:37<13:07,  1.08s/it]
 42%|████▏     | 533/1261 [09:38<13:02,  1.07s/it]
 42%|████▏     | 534/1261 [09:39<12:59,  1.07s/it]
 42%|████▏     | 535/1261 [09:40<12:54,  1.07s/it]
 43%|████▎     | 536/1261 [09:42<12:53,  1.07s/it]
 43%|████▎     | 537/1261 [09:43<12:49,  1.06s/it]
 43%|████▎     | 538/1261 [09:44<12:48,  1.06s/it]
 43%|████▎     | 539/1261 [09:45<12:50,  1.07s/it]
 43%|████▎     | 540/1261 [09:46<12:53,  1.07s/it]
 43%|████▎     | 541/1261 [09:47<12:53,  1.07s/it]
 43%|████▎     | 542/1261 [09:48<12:47,  1.07s/it]
 43%|████▎     | 543/1261 [09:49<12:47,  1.07s/it]
 43%|████▎     | 544/1261 [09:50<12:44,  1.07s/it]
 43%|████▎     | 545/1261 [09:51<12:39,  1.06s/it]
 43%|████▎     | 546/1261 [09:52<12:56,  1.09s/it]
 43%|████▎     | 547/1261 [09:53<12:49,  1.08s/it]
 43%|████▎     | 548/1261 [09:54<12:46,  1.07s/it]
 44%|████▎     | 549/1261 [09:56<12:50,  1.08s/it]
 44%|████▎     | 550/1261 [09:57<12:48,  1.08s/it]
 44%|████▎     | 551/1261 [09:58<12:45,  1.08s/it]
 44%|████▍     | 552/1261 [09:59<12:45,  1.08s/it]
 44%|████▍     | 553/1261 [10:00<13:01,  1.10s/it]
 44%|████▍     | 554/1261 [10:01<12:50,  1.09s/it]
 44%|████▍     | 555/1261 [10:02<12:44,  1.08s/it]
 44%|████▍     | 556/1261 [10:03<12:58,  1.10s/it]
 44%|████▍     | 557/1261 [10:04<12:52,  1.10s/it]
 44%|████▍     | 558/1261 [10:05<12:41,  1.08s/it]
 44%|████▍     | 559/1261 [10:06<12:34,  1.08s/it]
 44%|████▍     | 560/1261 [10:07<12:29,  1.07s/it]
 44%|████▍     | 561/1261 [10:09<12:33,  1.08s/it]
 45%|████▍     | 562/1261 [10:10<12:27,  1.07s/it]
 45%|████▍     | 563/1261 [10:11<12:24,  1.07s/it]
 45%|████▍     | 564/1261 [10:12<12:24,  1.07s/it]
 45%|████▍     | 565/1261 [10:13<12:23,  1.07s/it]
 45%|████▍     | 566/1261 [10:14<12:17,  1.06s/it]
 45%|████▍     | 567/1261 [10:15<12:14,  1.06s/it]
 45%|████▌     | 568/1261 [10:16<12:21,  1.07s/it]
 45%|████▌     | 569/1261 [10:17<12:17,  1.07s/it]
 45%|████▌     | 570/1261 [10:18<12:15,  1.06s/it]
 45%|████▌     | 571/1261 [10:19<12:21,  1.07s/it]
 45%|████▌     | 572/1261 [10:20<12:17,  1.07s/it]
 45%|████▌     | 573/1261 [10:21<12:13,  1.07s/it]
 46%|████▌     | 574/1261 [10:22<12:09,  1.06s/it]
 46%|████▌     | 575/1261 [10:23<12:08,  1.06s/it]
 46%|████▌     | 576/1261 [10:25<12:12,  1.07s/it]
 46%|████▌     | 577/1261 [10:26<12:05,  1.06s/it]
 46%|████▌     | 578/1261 [10:27<12:05,  1.06s/it]
 46%|████▌     | 579/1261 [10:28<12:06,  1.07s/it]
 46%|████▌     | 580/1261 [10:29<12:02,  1.06s/it]
 46%|████▌     | 581/1261 [10:30<12:00,  1.06s/it]
 46%|████▌     | 582/1261 [10:31<12:03,  1.07s/it]
 46%|████▌     | 583/1261 [10:32<12:04,  1.07s/it]
 46%|████▋     | 584/1261 [10:33<11:59,  1.06s/it]
 46%|████▋     | 585/1261 [10:34<11:58,  1.06s/it]
 46%|████▋     | 586/1261 [10:35<11:56,  1.06s/it]
 47%|████▋     | 587/1261 [10:36<11:56,  1.06s/it]
 47%|████▋     | 588/1261 [10:37<11:58,  1.07s/it]
 47%|████▋     | 589/1261 [10:38<12:00,  1.07s/it]
 47%|████▋     | 590/1261 [10:40<12:16,  1.10s/it]
 47%|████▋     | 591/1261 [10:41<12:15,  1.10s/it]
 47%|████▋     | 592/1261 [10:42<12:06,  1.09s/it]
 47%|████▋     | 593/1261 [10:43<12:01,  1.08s/it]
 47%|████▋     | 594/1261 [10:44<12:02,  1.08s/it]
 47%|████▋     | 595/1261 [10:45<11:59,  1.08s/it]
 47%|████▋     | 596/1261 [10:46<11:56,  1.08s/it]
 47%|████▋     | 597/1261 [10:47<11:51,  1.07s/it]
 47%|████▋     | 598/1261 [10:48<11:48,  1.07s/it]
 48%|████▊     | 599/1261 [10:49<11:48,  1.07s/it]
 48%|████▊     | 600/1261 [10:50<11:44,  1.07s/it]
 48%|████▊     | 601/1261 [10:51<11:47,  1.07s/it]
 48%|████▊     | 602/1261 [10:52<11:48,  1.08s/it]
 48%|████▊     | 603/1261 [10:53<11:48,  1.08s/it]
 48%|████▊     | 604/1261 [10:55<11:45,  1.07s/it]
 48%|████▊     | 605/1261 [10:56<11:45,  1.07s/it]
 48%|████▊     | 606/1261 [10:57<11:43,  1.07s/it]
 48%|████▊     | 607/1261 [10:58<11:45,  1.08s/it]
 48%|████▊     | 608/1261 [10:59<11:45,  1.08s/it]
 48%|████▊     | 609/1261 [11:00<11:48,  1.09s/it]
 48%|████▊     | 610/1261 [11:01<11:46,  1.08s/it]
 48%|████▊     | 611/1261 [11:02<11:38,  1.07s/it]
 49%|████▊     | 612/1261 [11:03<11:32,  1.07s/it]
 49%|████▊     | 613/1261 [11:04<11:31,  1.07s/it]
 49%|████▊     | 614/1261 [11:05<11:31,  1.07s/it]
 49%|████▉     | 615/1261 [11:06<11:29,  1.07s/it]
 49%|████▉     | 616/1261 [11:07<11:29,  1.07s/it]
 49%|████▉     | 617/1261 [11:08<11:26,  1.07s/it]
 49%|████▉     | 618/1261 [11:10<11:29,  1.07s/it]
 49%|████▉     | 619/1261 [11:11<11:30,  1.08s/it]
 49%|████▉     | 620/1261 [11:12<11:30,  1.08s/it]
 49%|████▉     | 621/1261 [11:13<11:29,  1.08s/it]
 49%|████▉     | 622/1261 [11:14<11:26,  1.07s/it]
 49%|████▉     | 623/1261 [11:15<11:24,  1.07s/it]
 49%|████▉     | 624/1261 [11:16<11:25,  1.08s/it]
 50%|████▉     | 625/1261 [11:17<11:18,  1.07s/it]
 50%|████▉     | 626/1261 [11:18<11:17,  1.07s/it]
 50%|████▉     | 627/1261 [11:19<11:19,  1.07s/it]
 50%|████▉     | 628/1261 [11:20<11:20,  1.08s/it]
 50%|████▉     | 629/1261 [11:21<11:17,  1.07s/it]
 50%|████▉     | 630/1261 [11:22<11:12,  1.07s/it]
 50%|█████     | 631/1261 [11:24<11:17,  1.08s/it]
 50%|█████     | 632/1261 [11:25<11:13,  1.07s/it]
 50%|█████     | 633/1261 [11:26<11:11,  1.07s/it]
 50%|█████     | 634/1261 [11:27<11:11,  1.07s/it]
 50%|█████     | 635/1261 [11:28<11:13,  1.08s/it]
 50%|█████     | 636/1261 [11:29<11:09,  1.07s/it]
 51%|█████     | 637/1261 [11:30<11:05,  1.07s/it]
 51%|█████     | 638/1261 [11:31<11:05,  1.07s/it]
 51%|█████     | 639/1261 [11:32<11:03,  1.07s/it]
 51%|█████     | 640/1261 [11:33<11:03,  1.07s/it]
 51%|█████     | 641/1261 [11:34<11:06,  1.07s/it]
 51%|█████     | 642/1261 [11:35<11:00,  1.07s/it]
 51%|█████     | 643/1261 [11:36<11:03,  1.07s/it]
 51%|█████     | 644/1261 [11:37<10:59,  1.07s/it]
 51%|█████     | 645/1261 [11:38<10:58,  1.07s/it]
 51%|█████     | 646/1261 [11:40<11:04,  1.08s/it]
 51%|█████▏    | 647/1261 [11:41<11:10,  1.09s/it]
 51%|█████▏    | 648/1261 [11:42<11:02,  1.08s/it]
 51%|█████▏    | 649/1261 [11:43<11:03,  1.08s/it]
 52%|█████▏    | 650/1261 [11:44<11:25,  1.12s/it]
 52%|█████▏    | 651/1261 [11:45<11:23,  1.12s/it]
 52%|█████▏    | 652/1261 [11:46<11:21,  1.12s/it]
 52%|█████▏    | 653/1261 [11:48<11:36,  1.15s/it]
 52%|█████▏    | 654/1261 [11:49<11:22,  1.12s/it]
 52%|█████▏    | 655/1261 [11:50<11:17,  1.12s/it]
 52%|█████▏    | 656/1261 [11:51<11:23,  1.13s/it]
 52%|█████▏    | 657/1261 [11:52<11:20,  1.13s/it]
 52%|█████▏    | 658/1261 [11:53<11:12,  1.11s/it]
 52%|█████▏    | 659/1261 [11:54<11:03,  1.10s/it]
 52%|█████▏    | 660/1261 [11:55<10:57,  1.09s/it]
 52%|█████▏    | 661/1261 [11:56<10:50,  1.08s/it]
 52%|█████▏    | 662/1261 [11:57<10:50,  1.09s/it]
 53%|█████▎    | 663/1261 [11:58<10:44,  1.08s/it]
 53%|█████▎    | 664/1261 [11:59<10:42,  1.08s/it]
 53%|█████▎    | 665/1261 [12:01<10:37,  1.07s/it]
 53%|█████▎    | 666/1261 [12:02<10:35,  1.07s/it]
 53%|█████▎    | 667/1261 [12:03<10:33,  1.07s/it]
 53%|█████▎    | 668/1261 [12:04<10:32,  1.07s/it]
 53%|█████▎    | 669/1261 [12:05<10:32,  1.07s/it]
 53%|█████▎    | 670/1261 [12:06<10:30,  1.07s/it]
 53%|█████▎    | 671/1261 [12:07<10:33,  1.07s/it]
 53%|█████▎    | 672/1261 [12:08<10:29,  1.07s/it]
 53%|█████▎    | 673/1261 [12:09<10:26,  1.07s/it]
 53%|█████▎    | 674/1261 [12:10<10:27,  1.07s/it]
 54%|█████▎    | 675/1261 [12:11<10:24,  1.07s/it]
 54%|█████▎    | 676/1261 [12:12<10:22,  1.06s/it]
 54%|█████▎    | 677/1261 [12:13<10:20,  1.06s/it]
 54%|█████▍    | 678/1261 [12:14<10:17,  1.06s/it]
 54%|█████▍    | 679/1261 [12:15<10:18,  1.06s/it]
 54%|█████▍    | 680/1261 [12:16<10:17,  1.06s/it]
 54%|█████▍    | 681/1261 [12:18<10:19,  1.07s/it]
 54%|█████▍    | 682/1261 [12:19<10:17,  1.07s/it]
 54%|█████▍    | 683/1261 [12:20<10:16,  1.07s/it]
 54%|█████▍    | 684/1261 [12:21<10:14,  1.07s/it]
 54%|█████▍    | 685/1261 [12:22<10:16,  1.07s/it]
 54%|█████▍    | 686/1261 [12:23<10:14,  1.07s/it]
 54%|█████▍    | 687/1261 [12:24<10:15,  1.07s/it]
 55%|█████▍    | 688/1261 [12:25<10:12,  1.07s/it]
 55%|█████▍    | 689/1261 [12:26<10:10,  1.07s/it]
 55%|█████▍    | 690/1261 [12:27<10:09,  1.07s/it]
 55%|█████▍    | 691/1261 [12:28<10:06,  1.06s/it]
 55%|█████▍    | 692/1261 [12:29<10:02,  1.06s/it]
 55%|█████▍    | 693/1261 [12:30<10:04,  1.06s/it]
 55%|█████▌    | 694/1261 [12:31<10:07,  1.07s/it]
 55%|█████▌    | 695/1261 [12:32<10:01,  1.06s/it]
 55%|█████▌    | 696/1261 [12:34<10:03,  1.07s/it]
 55%|█████▌    | 697/1261 [12:35<10:00,  1.06s/it]
 55%|█████▌    | 698/1261 [12:36<10:01,  1.07s/it]
 55%|█████▌    | 699/1261 [12:37<10:02,  1.07s/it]
 56%|█████▌    | 700/1261 [12:38<10:00,  1.07s/it]
 56%|█████▌    | 701/1261 [12:39<09:57,  1.07s/it]
 56%|█████▌    | 702/1261 [12:40<09:56,  1.07s/it]
 56%|█████▌    | 703/1261 [12:41<09:52,  1.06s/it]
 56%|█████▌    | 704/1261 [12:42<09:51,  1.06s/it]
 56%|█████▌    | 705/1261 [12:43<09:49,  1.06s/it]
 56%|█████▌    | 706/1261 [12:44<09:49,  1.06s/it]
 56%|█████▌    | 707/1261 [12:45<09:50,  1.07s/it]
 56%|█████▌    | 708/1261 [12:46<09:50,  1.07s/it]
 56%|█████▌    | 709/1261 [12:47<09:46,  1.06s/it]
 56%|█████▋    | 710/1261 [12:49<09:48,  1.07s/it]
 56%|█████▋    | 711/1261 [12:50<09:42,  1.06s/it]
 56%|█████▋    | 712/1261 [12:51<09:42,  1.06s/it]
 57%|█████▋    | 713/1261 [12:52<09:41,  1.06s/it]
 57%|█████▋    | 714/1261 [12:53<09:35,  1.05s/it]
 57%|█████▋    | 715/1261 [12:54<09:37,  1.06s/it]
 57%|█████▋    | 716/1261 [12:55<09:35,  1.06s/it]
 57%|█████▋    | 717/1261 [12:56<09:36,  1.06s/it]
 57%|█████▋    | 718/1261 [12:57<09:37,  1.06s/it]
 57%|█████▋    | 719/1261 [12:58<09:38,  1.07s/it]
 57%|█████▋    | 720/1261 [12:59<09:38,  1.07s/it]
 57%|█████▋    | 721/1261 [13:00<09:37,  1.07s/it]
 57%|█████▋    | 722/1261 [13:01<09:34,  1.07s/it]
 57%|█████▋    | 723/1261 [13:02<09:34,  1.07s/it]
 57%|█████▋    | 724/1261 [13:03<09:32,  1.07s/it]
 57%|█████▋    | 725/1261 [13:04<09:31,  1.07s/it]
 58%|█████▊    | 726/1261 [13:05<09:27,  1.06s/it]
 58%|█████▊    | 727/1261 [13:07<09:24,  1.06s/it]
 58%|█████▊    | 728/1261 [13:08<09:26,  1.06s/it]
 58%|█████▊    | 729/1261 [13:09<09:24,  1.06s/it]
 58%|█████▊    | 730/1261 [13:10<09:24,  1.06s/it]
 58%|█████▊    | 731/1261 [13:11<09:33,  1.08s/it]
 58%|█████▊    | 732/1261 [13:12<09:28,  1.07s/it]
 58%|█████▊    | 733/1261 [13:13<09:28,  1.08s/it]
 58%|█████▊    | 734/1261 [13:14<09:24,  1.07s/it]
 58%|█████▊    | 735/1261 [13:15<09:22,  1.07s/it]
 58%|█████▊    | 736/1261 [13:16<09:26,  1.08s/it]
 58%|█████▊    | 737/1261 [13:17<09:22,  1.07s/it]
 59%|█████▊    | 738/1261 [13:18<09:18,  1.07s/it]
 59%|█████▊    | 739/1261 [13:19<09:17,  1.07s/it]
 59%|█████▊    | 740/1261 [13:20<09:13,  1.06s/it]
 59%|█████▉    | 741/1261 [13:22<09:12,  1.06s/it]
 59%|█████▉    | 742/1261 [13:23<09:07,  1.05s/it]
 59%|█████▉    | 743/1261 [13:24<09:06,  1.05s/it]
 59%|█████▉    | 744/1261 [13:25<09:08,  1.06s/it]
 59%|█████▉    | 745/1261 [13:26<09:07,  1.06s/it]
 59%|█████▉    | 746/1261 [13:27<09:05,  1.06s/it]
 59%|█████▉    | 747/1261 [13:28<09:08,  1.07s/it]
 59%|█████▉    | 748/1261 [13:29<09:10,  1.07s/it]
 59%|█████▉    | 749/1261 [13:30<09:09,  1.07s/it]
 59%|█████▉    | 750/1261 [13:31<09:04,  1.06s/it]
 60%|█████▉    | 751/1261 [13:32<09:04,  1.07s/it]
 60%|█████▉    | 752/1261 [13:33<09:04,  1.07s/it]
 60%|█████▉    | 753/1261 [13:34<09:05,  1.07s/it]
 60%|█████▉    | 754/1261 [13:35<09:01,  1.07s/it]
 60%|█████▉    | 755/1261 [13:36<08:58,  1.07s/it]
 60%|█████▉    | 756/1261 [13:38<08:57,  1.06s/it]
 60%|██████    | 757/1261 [13:39<08:56,  1.06s/it]
 60%|██████    | 758/1261 [13:40<08:55,  1.06s/it]
 60%|██████    | 759/1261 [13:41<08:56,  1.07s/it]
 60%|██████    | 760/1261 [13:42<08:55,  1.07s/it]
 60%|██████    | 761/1261 [13:43<08:55,  1.07s/it]
 60%|██████    | 762/1261 [13:44<08:51,  1.07s/it]
 61%|██████    | 763/1261 [13:45<08:50,  1.07s/it]
 61%|██████    | 764/1261 [13:46<08:53,  1.07s/it]
 61%|██████    | 765/1261 [13:47<08:50,  1.07s/it]
 61%|██████    | 766/1261 [13:48<08:46,  1.06s/it]
 61%|██████    | 767/1261 [13:49<08:46,  1.06s/it]
 61%|██████    | 768/1261 [13:50<08:43,  1.06s/it]
 61%|██████    | 769/1261 [13:51<08:42,  1.06s/it]
 61%|██████    | 770/1261 [13:52<08:41,  1.06s/it]
 61%|██████    | 771/1261 [13:53<08:40,  1.06s/it]
 61%|██████    | 772/1261 [13:55<08:41,  1.07s/it]
 61%|██████▏   | 773/1261 [13:56<08:42,  1.07s/it]
 61%|██████▏   | 774/1261 [13:57<08:43,  1.07s/it]
 61%|██████▏   | 775/1261 [13:58<08:41,  1.07s/it]
 62%|██████▏   | 776/1261 [13:59<08:39,  1.07s/it]
 62%|██████▏   | 777/1261 [14:00<08:36,  1.07s/it]
 62%|██████▏   | 778/1261 [14:01<08:33,  1.06s/it]
 62%|██████▏   | 779/1261 [14:02<08:30,  1.06s/it]
 62%|██████▏   | 780/1261 [14:03<08:29,  1.06s/it]
 62%|██████▏   | 781/1261 [14:04<08:31,  1.07s/it]
 62%|██████▏   | 782/1261 [14:05<08:35,  1.08s/it]
 62%|██████▏   | 783/1261 [14:06<08:32,  1.07s/it]
 62%|██████▏   | 784/1261 [14:07<08:29,  1.07s/it]
 62%|██████▏   | 785/1261 [14:08<08:28,  1.07s/it]
 62%|██████▏   | 786/1261 [14:10<08:24,  1.06s/it]
 62%|██████▏   | 787/1261 [14:11<08:23,  1.06s/it]
 62%|██████▏   | 788/1261 [14:12<08:23,  1.06s/it]
 63%|██████▎   | 789/1261 [14:13<08:24,  1.07s/it]
 63%|██████▎   | 790/1261 [14:14<08:23,  1.07s/it]
 63%|██████▎   | 791/1261 [14:15<08:22,  1.07s/it]
 63%|██████▎   | 792/1261 [14:16<08:23,  1.07s/it]
 63%|██████▎   | 793/1261 [14:17<08:21,  1.07s/it]
 63%|██████▎   | 794/1261 [14:18<08:22,  1.08s/it]
 63%|██████▎   | 795/1261 [14:19<08:22,  1.08s/it]
 63%|██████▎   | 796/1261 [14:20<08:21,  1.08s/it]
 63%|██████▎   | 797/1261 [14:21<08:15,  1.07s/it]
 63%|██████▎   | 798/1261 [14:22<08:16,  1.07s/it]
 63%|██████▎   | 799/1261 [14:23<08:15,  1.07s/it]
 63%|██████▎   | 800/1261 [14:25<08:16,  1.08s/it]
 64%|██████▎   | 801/1261 [14:26<08:15,  1.08s/it]
 64%|██████▎   | 802/1261 [14:27<08:13,  1.08s/it]
 64%|██████▎   | 803/1261 [14:28<08:10,  1.07s/it]
 64%|██████▍   | 804/1261 [14:29<08:09,  1.07s/it]
 64%|██████▍   | 805/1261 [14:30<08:10,  1.07s/it]
 64%|██████▍   | 806/1261 [14:31<08:07,  1.07s/it]
 64%|██████▍   | 807/1261 [14:32<08:07,  1.07s/it]
 64%|██████▍   | 808/1261 [14:33<08:06,  1.07s/it]
 64%|██████▍   | 809/1261 [14:34<08:05,  1.08s/it]
 64%|██████▍   | 810/1261 [14:35<08:01,  1.07s/it]
 64%|██████▍   | 811/1261 [14:36<08:02,  1.07s/it]
 64%|██████▍   | 812/1261 [14:37<07:59,  1.07s/it]
 64%|██████▍   | 813/1261 [14:38<07:58,  1.07s/it]
 65%|██████▍   | 814/1261 [14:40<08:00,  1.07s/it]
 65%|██████▍   | 815/1261 [14:41<07:56,  1.07s/it]
 65%|██████▍   | 816/1261 [14:42<07:55,  1.07s/it]
 65%|██████▍   | 817/1261 [14:43<07:53,  1.07s/it]
 65%|██████▍   | 818/1261 [14:44<07:54,  1.07s/it]
 65%|██████▍   | 819/1261 [14:45<07:54,  1.07s/it]
 65%|██████▌   | 820/1261 [14:46<07:51,  1.07s/it]
 65%|██████▌   | 821/1261 [14:47<07:51,  1.07s/it]
 65%|██████▌   | 822/1261 [14:48<07:49,  1.07s/it]
 65%|██████▌   | 823/1261 [14:49<07:51,  1.08s/it]
 65%|██████▌   | 824/1261 [14:50<07:51,  1.08s/it]
 65%|██████▌   | 825/1261 [14:51<07:51,  1.08s/it]
 66%|██████▌   | 826/1261 [14:52<07:48,  1.08s/it]
 66%|██████▌   | 827/1261 [14:53<07:45,  1.07s/it]
 66%|██████▌   | 828/1261 [14:55<07:42,  1.07s/it]
 66%|██████▌   | 829/1261 [14:56<07:41,  1.07s/it]
 66%|██████▌   | 830/1261 [14:57<07:41,  1.07s/it]
 66%|██████▌   | 831/1261 [14:58<07:42,  1.08s/it]
 66%|██████▌   | 832/1261 [14:59<07:41,  1.08s/it]
 66%|██████▌   | 833/1261 [15:00<07:39,  1.07s/it]
 66%|██████▌   | 834/1261 [15:01<07:36,  1.07s/it]
 66%|██████▌   | 835/1261 [15:02<07:35,  1.07s/it]
 66%|██████▋   | 836/1261 [15:03<07:35,  1.07s/it]
 66%|██████▋   | 837/1261 [15:04<07:32,  1.07s/it]
 66%|██████▋   | 838/1261 [15:05<07:31,  1.07s/it]
 67%|██████▋   | 839/1261 [15:06<07:29,  1.07s/it]
 67%|██████▋   | 840/1261 [15:07<07:27,  1.06s/it]
 67%|██████▋   | 841/1261 [15:08<07:28,  1.07s/it]
 67%|██████▋   | 842/1261 [15:10<07:28,  1.07s/it]
 67%|██████▋   | 843/1261 [15:11<07:29,  1.07s/it]
 67%|██████▋   | 844/1261 [15:12<07:28,  1.08s/it]
 67%|██████▋   | 845/1261 [15:13<07:25,  1.07s/it]
 67%|██████▋   | 846/1261 [15:14<07:27,  1.08s/it]
 67%|██████▋   | 847/1261 [15:15<07:24,  1.07s/it]
 67%|██████▋   | 848/1261 [15:16<07:25,  1.08s/it]
 67%|██████▋   | 849/1261 [15:17<07:23,  1.08s/it]
 67%|██████▋   | 850/1261 [15:18<07:20,  1.07s/it]
 67%|██████▋   | 851/1261 [15:19<07:20,  1.07s/it]
 68%|██████▊   | 852/1261 [15:20<07:18,  1.07s/it]
 68%|██████▊   | 853/1261 [15:21<07:16,  1.07s/it]
 68%|██████▊   | 854/1261 [15:22<07:17,  1.07s/it]
 68%|██████▊   | 855/1261 [15:23<07:14,  1.07s/it]
 68%|██████▊   | 856/1261 [15:25<07:16,  1.08s/it]
 68%|██████▊   | 857/1261 [15:26<07:15,  1.08s/it]
 68%|██████▊   | 858/1261 [15:27<07:15,  1.08s/it]
 68%|██████▊   | 859/1261 [15:28<07:12,  1.07s/it]
 68%|██████▊   | 860/1261 [15:29<07:09,  1.07s/it]
 68%|██████▊   | 861/1261 [15:30<07:07,  1.07s/it]
 68%|██████▊   | 862/1261 [15:31<07:05,  1.07s/it]
 68%|██████▊   | 863/1261 [15:32<07:03,  1.06s/it]
 69%|██████▊   | 864/1261 [15:33<07:03,  1.07s/it]
 69%|██████▊   | 865/1261 [15:34<07:04,  1.07s/it]
 69%|██████▊   | 866/1261 [15:35<07:03,  1.07s/it]
 69%|██████▉   | 867/1261 [15:36<07:13,  1.10s/it]
 69%|██████▉   | 868/1261 [15:38<07:08,  1.09s/it]
 69%|██████▉   | 869/1261 [15:39<07:05,  1.09s/it]
 69%|██████▉   | 870/1261 [15:40<07:02,  1.08s/it]
 69%|██████▉   | 871/1261 [15:41<07:01,  1.08s/it]
 69%|██████▉   | 872/1261 [15:42<06:59,  1.08s/it]
 69%|██████▉   | 873/1261 [15:43<06:56,  1.07s/it]
 69%|██████▉   | 874/1261 [15:44<06:55,  1.07s/it]
 69%|██████▉   | 875/1261 [15:45<06:52,  1.07s/it]
 69%|██████▉   | 876/1261 [15:46<06:54,  1.08s/it]
 70%|██████▉   | 877/1261 [15:47<06:51,  1.07s/it]
 70%|██████▉   | 878/1261 [15:48<06:48,  1.07s/it]
 70%|██████▉   | 879/1261 [15:49<06:48,  1.07s/it]
 70%|██████▉   | 880/1261 [15:50<06:46,  1.07s/it]
 70%|██████▉   | 881/1261 [15:51<06:49,  1.08s/it]
 70%|██████▉   | 882/1261 [15:53<06:47,  1.08s/it]
 70%|███████   | 883/1261 [15:54<06:47,  1.08s/it]
 70%|███████   | 884/1261 [15:55<06:44,  1.07s/it]
 70%|███████   | 885/1261 [15:56<06:42,  1.07s/it]
 70%|███████   | 886/1261 [15:57<06:42,  1.07s/it]
 70%|███████   | 887/1261 [15:58<06:40,  1.07s/it]
 70%|███████   | 888/1261 [15:59<06:40,  1.07s/it]
 70%|███████   | 889/1261 [16:00<06:37,  1.07s/it]
 71%|███████   | 890/1261 [16:01<06:39,  1.08s/it]
 71%|███████   | 891/1261 [16:02<06:37,  1.07s/it]
 71%|███████   | 892/1261 [16:03<06:34,  1.07s/it]
 71%|███████   | 893/1261 [16:04<06:34,  1.07s/it]
 71%|███████   | 894/1261 [16:05<06:32,  1.07s/it]
 71%|███████   | 895/1261 [16:06<06:33,  1.08s/it]
 71%|███████   | 896/1261 [16:08<06:31,  1.07s/it]
 71%|███████   | 897/1261 [16:09<06:31,  1.08s/it]
 71%|███████   | 898/1261 [16:10<06:31,  1.08s/it]
 71%|███████▏  | 899/1261 [16:11<06:28,  1.07s/it]
 71%|███████▏  | 900/1261 [16:12<06:26,  1.07s/it]
 71%|███████▏  | 901/1261 [16:13<06:24,  1.07s/it]
 72%|███████▏  | 902/1261 [16:14<06:23,  1.07s/it]
 72%|███████▏  | 903/1261 [16:15<06:19,  1.06s/it]
 72%|███████▏  | 904/1261 [16:16<06:20,  1.07s/it]
 72%|███████▏  | 905/1261 [16:17<06:17,  1.06s/it]
 72%|███████▏  | 906/1261 [16:18<06:23,  1.08s/it]
 72%|███████▏  | 907/1261 [16:19<06:20,  1.08s/it]
 72%|███████▏  | 908/1261 [16:20<06:19,  1.08s/it]
 72%|███████▏  | 909/1261 [16:21<06:20,  1.08s/it]
 72%|███████▏  | 910/1261 [16:23<06:18,  1.08s/it]
 72%|███████▏  | 911/1261 [16:24<06:17,  1.08s/it]
 72%|███████▏  | 912/1261 [16:25<06:15,  1.08s/it]
 72%|███████▏  | 913/1261 [16:26<06:13,  1.07s/it]
 72%|███████▏  | 914/1261 [16:27<06:12,  1.07s/it]
 73%|███████▎  | 915/1261 [16:28<06:08,  1.06s/it]
 73%|███████▎  | 916/1261 [16:29<06:08,  1.07s/it]
 73%|███████▎  | 917/1261 [16:30<06:06,  1.07s/it]
 73%|███████▎  | 918/1261 [16:31<06:05,  1.07s/it]
 73%|███████▎  | 919/1261 [16:32<06:06,  1.07s/it]
 73%|███████▎  | 920/1261 [16:33<06:06,  1.08s/it]
 73%|███████▎  | 921/1261 [16:34<06:11,  1.09s/it]
 73%|███████▎  | 922/1261 [16:35<06:07,  1.08s/it]
 73%|███████▎  | 923/1261 [16:37<06:04,  1.08s/it]
 73%|███████▎  | 924/1261 [16:38<06:03,  1.08s/it]
 73%|███████▎  | 925/1261 [16:39<06:01,  1.08s/it]
 73%|███████▎  | 926/1261 [16:40<06:00,  1.07s/it]
 74%|███████▎  | 927/1261 [16:41<05:58,  1.07s/it]
 74%|███████▎  | 928/1261 [16:42<05:55,  1.07s/it]
 74%|███████▎  | 929/1261 [16:43<05:54,  1.07s/it]
 74%|███████▍  | 930/1261 [16:44<05:54,  1.07s/it]
 74%|███████▍  | 931/1261 [16:45<06:02,  1.10s/it]
 74%|███████▍  | 932/1261 [16:46<05:59,  1.09s/it]
 74%|███████▍  | 933/1261 [16:47<05:55,  1.08s/it]
 74%|███████▍  | 934/1261 [16:48<05:51,  1.08s/it]
 74%|███████▍  | 935/1261 [16:49<05:50,  1.07s/it]
 74%|███████▍  | 936/1261 [16:51<05:50,  1.08s/it]
 74%|███████▍  | 937/1261 [16:52<05:49,  1.08s/it]
 74%|███████▍  | 938/1261 [16:53<05:48,  1.08s/it]
 74%|███████▍  | 939/1261 [16:54<05:46,  1.08s/it]
 75%|███████▍  | 940/1261 [16:55<05:44,  1.07s/it]
 75%|███████▍  | 941/1261 [16:56<05:39,  1.06s/it]
 75%|███████▍  | 942/1261 [16:57<05:38,  1.06s/it]
 75%|███████▍  | 943/1261 [16:58<05:35,  1.06s/it]
 75%|███████▍  | 944/1261 [16:59<05:35,  1.06s/it]
 75%|███████▍  | 945/1261 [17:00<05:34,  1.06s/it]
 75%|███████▌  | 946/1261 [17:01<05:32,  1.06s/it]
 75%|███████▌  | 947/1261 [17:02<05:31,  1.06s/it]
 75%|███████▌  | 948/1261 [17:03<05:33,  1.06s/it]
 75%|███████▌  | 949/1261 [17:04<05:34,  1.07s/it]
 75%|███████▌  | 950/1261 [17:05<05:31,  1.06s/it]
 75%|███████▌  | 951/1261 [17:06<05:28,  1.06s/it]
 75%|███████▌  | 952/1261 [17:08<05:27,  1.06s/it]
 76%|███████▌  | 953/1261 [17:09<05:27,  1.06s/it]
 76%|███████▌  | 954/1261 [17:10<05:28,  1.07s/it]
 76%|███████▌  | 955/1261 [17:11<05:24,  1.06s/it]
 76%|███████▌  | 956/1261 [17:12<05:23,  1.06s/it]
 76%|███████▌  | 957/1261 [17:13<05:23,  1.06s/it]
 76%|███████▌  | 958/1261 [17:14<05:22,  1.06s/it]
 76%|███████▌  | 959/1261 [17:15<05:24,  1.08s/it]
 76%|███████▌  | 960/1261 [17:16<05:22,  1.07s/it]
 76%|███████▌  | 961/1261 [17:17<05:20,  1.07s/it]
 76%|███████▋  | 962/1261 [17:18<05:18,  1.07s/it]
 76%|███████▋  | 963/1261 [17:19<05:18,  1.07s/it]
 76%|███████▋  | 964/1261 [17:20<05:15,  1.06s/it]
 77%|███████▋  | 965/1261 [17:21<05:12,  1.06s/it]
 77%|███████▋  | 966/1261 [17:22<05:16,  1.07s/it]
 77%|███████▋  | 967/1261 [17:24<05:16,  1.08s/it]
 77%|███████▋  | 968/1261 [17:25<05:14,  1.07s/it]
 77%|███████▋  | 969/1261 [17:26<05:11,  1.07s/it]
 77%|███████▋  | 970/1261 [17:27<05:10,  1.07s/it]
 77%|███████▋  | 971/1261 [17:28<05:08,  1.06s/it]
 77%|███████▋  | 972/1261 [17:29<05:09,  1.07s/it]
 77%|███████▋  | 973/1261 [17:30<05:07,  1.07s/it]
 77%|███████▋  | 974/1261 [17:31<05:08,  1.07s/it]
 77%|███████▋  | 975/1261 [17:32<05:08,  1.08s/it]
 77%|███████▋  | 976/1261 [17:33<05:05,  1.07s/it]
 77%|███████▋  | 977/1261 [17:34<05:09,  1.09s/it]
 78%|███████▊  | 978/1261 [17:35<05:06,  1.08s/it]
 78%|███████▊  | 979/1261 [17:36<05:02,  1.07s/it]
 78%|███████▊  | 980/1261 [17:38<05:01,  1.07s/it]
 78%|███████▊  | 981/1261 [17:39<04:59,  1.07s/it]
 78%|███████▊  | 982/1261 [17:40<04:58,  1.07s/it]
 78%|███████▊  | 983/1261 [17:41<04:56,  1.07s/it]
 78%|███████▊  | 984/1261 [17:42<04:55,  1.07s/it]
 78%|███████▊  | 985/1261 [17:43<04:54,  1.07s/it]
 78%|███████▊  | 986/1261 [17:44<04:53,  1.07s/it]
 78%|███████▊  | 987/1261 [17:45<04:52,  1.07s/it]
 78%|███████▊  | 988/1261 [17:46<04:50,  1.06s/it]
 78%|███████▊  | 989/1261 [17:47<04:48,  1.06s/it]
 79%|███████▊  | 990/1261 [17:48<04:49,  1.07s/it]
 79%|███████▊  | 991/1261 [17:49<04:50,  1.07s/it]
 79%|███████▊  | 992/1261 [17:50<04:47,  1.07s/it]
 79%|███████▊  | 993/1261 [17:51<04:47,  1.07s/it]
 79%|███████▉  | 994/1261 [17:52<04:46,  1.07s/it]
 79%|███████▉  | 995/1261 [17:54<04:44,  1.07s/it]
 79%|███████▉  | 996/1261 [17:55<04:42,  1.07s/it]
 79%|███████▉  | 997/1261 [17:56<04:39,  1.06s/it]
 79%|███████▉  | 998/1261 [17:57<04:39,  1.06s/it]
 79%|███████▉  | 999/1261 [17:58<04:36,  1.06s/it]
 79%|███████▉  | 1000/1261 [17:59<04:35,  1.06s/it]
 79%|███████▉  | 1001/1261 [18:00<04:34,  1.06s/it]
 79%|███████▉  | 1002/1261 [18:01<04:32,  1.05s/it]
 80%|███████▉  | 1003/1261 [18:02<04:32,  1.05s/it]
 80%|███████▉  | 1004/1261 [18:03<04:31,  1.06s/it]
 80%|███████▉  | 1005/1261 [18:04<04:30,  1.06s/it]
 80%|███████▉  | 1006/1261 [18:05<04:33,  1.07s/it]
 80%|███████▉  | 1007/1261 [18:06<04:30,  1.06s/it]
 80%|███████▉  | 1008/1261 [18:07<04:28,  1.06s/it]
 80%|████████  | 1009/1261 [18:08<04:26,  1.06s/it]
 80%|████████  | 1010/1261 [18:09<04:31,  1.08s/it]
 80%|████████  | 1011/1261 [18:11<04:28,  1.08s/it]
 80%|████████  | 1012/1261 [18:12<04:25,  1.07s/it]
 80%|████████  | 1013/1261 [18:13<04:22,  1.06s/it]
 80%|████████  | 1014/1261 [18:14<04:22,  1.06s/it]
 80%|████████  | 1015/1261 [18:15<04:22,  1.07s/it]
 81%|████████  | 1016/1261 [18:16<04:19,  1.06s/it]
 81%|████████  | 1017/1261 [18:17<04:17,  1.05s/it]
 81%|████████  | 1018/1261 [18:18<04:15,  1.05s/it]
 81%|████████  | 1019/1261 [18:19<04:15,  1.05s/it]
 81%|████████  | 1020/1261 [18:20<04:17,  1.07s/it]
 81%|████████  | 1021/1261 [18:21<04:17,  1.07s/it]
 81%|████████  | 1022/1261 [18:22<04:14,  1.07s/it]
 81%|████████  | 1023/1261 [18:23<04:13,  1.07s/it]
 81%|████████  | 1024/1261 [18:24<04:12,  1.07s/it]
 81%|████████▏ | 1025/1261 [18:25<04:10,  1.06s/it]
 81%|████████▏ | 1026/1261 [18:27<04:13,  1.08s/it]
 81%|████████▏ | 1027/1261 [18:28<04:08,  1.06s/it]
 82%|████████▏ | 1028/1261 [18:29<04:10,  1.07s/it]
 82%|████████▏ | 1029/1261 [18:30<04:08,  1.07s/it]
 82%|████████▏ | 1030/1261 [18:31<04:06,  1.07s/it]
 82%|████████▏ | 1031/1261 [18:32<04:05,  1.07s/it]
 82%|████████▏ | 1032/1261 [18:33<04:04,  1.07s/it]
 82%|████████▏ | 1033/1261 [18:34<04:02,  1.07s/it]
 82%|████████▏ | 1034/1261 [18:35<04:03,  1.07s/it]
 82%|████████▏ | 1035/1261 [18:36<04:02,  1.07s/it]
 82%|████████▏ | 1036/1261 [18:37<04:02,  1.08s/it]
 82%|████████▏ | 1037/1261 [18:38<04:02,  1.08s/it]
 82%|████████▏ | 1038/1261 [18:39<04:02,  1.09s/it]
 82%|████████▏ | 1039/1261 [18:40<04:01,  1.09s/it]
 82%|████████▏ | 1040/1261 [18:42<04:01,  1.09s/it]
 83%|████████▎ | 1041/1261 [18:43<03:59,  1.09s/it]
 83%|████████▎ | 1042/1261 [18:44<04:00,  1.10s/it]
 83%|████████▎ | 1043/1261 [18:45<03:59,  1.10s/it]
 83%|████████▎ | 1044/1261 [18:46<03:57,  1.09s/it]
 83%|████████▎ | 1045/1261 [18:47<03:57,  1.10s/it]
 83%|████████▎ | 1046/1261 [18:48<03:54,  1.09s/it]
 83%|████████▎ | 1047/1261 [18:49<03:54,  1.09s/it]
 83%|████████▎ | 1048/1261 [18:50<03:53,  1.10s/it]
 83%|████████▎ | 1049/1261 [18:51<03:53,  1.10s/it]
 83%|████████▎ | 1050/1261 [18:53<03:52,  1.10s/it]
 83%|████████▎ | 1051/1261 [18:54<03:49,  1.09s/it]
 83%|████████▎ | 1052/1261 [18:55<03:48,  1.09s/it]
 84%|████████▎ | 1053/1261 [18:56<03:47,  1.09s/it]
 84%|████████▎ | 1054/1261 [18:57<03:46,  1.09s/it]
 84%|████████▎ | 1055/1261 [18:58<03:42,  1.08s/it]
 84%|████████▎ | 1056/1261 [18:59<03:42,  1.09s/it]
 84%|████████▍ | 1057/1261 [19:00<03:40,  1.08s/it]
 84%|████████▍ | 1058/1261 [19:01<03:38,  1.08s/it]
 84%|████████▍ | 1059/1261 [19:02<03:35,  1.07s/it]
 84%|████████▍ | 1060/1261 [19:03<03:33,  1.06s/it]
 84%|████████▍ | 1061/1261 [19:04<03:33,  1.07s/it]
 84%|████████▍ | 1062/1261 [19:05<03:32,  1.07s/it]
 84%|████████▍ | 1063/1261 [19:07<03:30,  1.06s/it]
 84%|████████▍ | 1064/1261 [19:08<03:29,  1.06s/it]
 84%|████████▍ | 1065/1261 [19:09<03:27,  1.06s/it]
 85%|████████▍ | 1066/1261 [19:10<03:27,  1.07s/it]
 85%|████████▍ | 1067/1261 [19:11<03:26,  1.06s/it]
 85%|████████▍ | 1068/1261 [19:12<03:25,  1.06s/it]
 85%|████████▍ | 1069/1261 [19:13<03:24,  1.07s/it]
 85%|████████▍ | 1070/1261 [19:14<03:23,  1.06s/it]
 85%|████████▍ | 1071/1261 [19:15<03:22,  1.07s/it]
 85%|████████▌ | 1072/1261 [19:16<03:21,  1.06s/it]
 85%|████████▌ | 1073/1261 [19:17<03:20,  1.07s/it]
 85%|████████▌ | 1074/1261 [19:18<03:17,  1.06s/it]
 85%|████████▌ | 1075/1261 [19:19<03:17,  1.06s/it]
 85%|████████▌ | 1076/1261 [19:20<03:15,  1.06s/it]
 85%|████████▌ | 1077/1261 [19:21<03:15,  1.06s/it]
 85%|████████▌ | 1078/1261 [19:22<03:14,  1.06s/it]
 86%|████████▌ | 1079/1261 [19:24<03:13,  1.06s/it]
 86%|████████▌ | 1080/1261 [19:25<03:15,  1.08s/it]
 86%|████████▌ | 1081/1261 [19:26<03:12,  1.07s/it]
 86%|████████▌ | 1082/1261 [19:27<03:10,  1.07s/it]
 86%|████████▌ | 1083/1261 [19:28<03:10,  1.07s/it]
 86%|████████▌ | 1084/1261 [19:29<03:07,  1.06s/it]
 86%|████████▌ | 1085/1261 [19:30<03:06,  1.06s/it]
 86%|████████▌ | 1086/1261 [19:31<03:05,  1.06s/it]
 86%|████████▌ | 1087/1261 [19:32<03:04,  1.06s/it]
 86%|████████▋ | 1088/1261 [19:33<03:03,  1.06s/it]
 86%|████████▋ | 1089/1261 [19:34<03:02,  1.06s/it]
 86%|████████▋ | 1090/1261 [19:35<03:07,  1.10s/it]
 87%|████████▋ | 1091/1261 [19:36<03:03,  1.08s/it]
 87%|████████▋ | 1092/1261 [19:37<03:01,  1.07s/it]
 87%|████████▋ | 1093/1261 [19:39<02:59,  1.07s/it]
 87%|████████▋ | 1094/1261 [19:40<03:00,  1.08s/it]
 87%|████████▋ | 1095/1261 [19:41<02:58,  1.08s/it]
 87%|████████▋ | 1096/1261 [19:42<02:56,  1.07s/it]
 87%|████████▋ | 1097/1261 [19:43<02:55,  1.07s/it]
 87%|████████▋ | 1098/1261 [19:44<02:54,  1.07s/it]
 87%|████████▋ | 1099/1261 [19:45<02:53,  1.07s/it]
 87%|████████▋ | 1100/1261 [19:46<02:53,  1.08s/it]
 87%|████████▋ | 1101/1261 [19:47<02:51,  1.07s/it]
 87%|████████▋ | 1102/1261 [19:48<02:49,  1.07s/it]
 87%|████████▋ | 1103/1261 [19:49<02:46,  1.06s/it]
 88%|████████▊ | 1104/1261 [19:50<02:45,  1.05s/it]
 88%|████████▊ | 1105/1261 [19:51<02:44,  1.06s/it]
 88%|████████▊ | 1106/1261 [19:52<02:44,  1.06s/it]
 88%|████████▊ | 1107/1261 [19:53<02:44,  1.07s/it]
 88%|████████▊ | 1108/1261 [19:55<02:43,  1.07s/it]
 88%|████████▊ | 1109/1261 [19:56<02:41,  1.06s/it]
 88%|████████▊ | 1110/1261 [19:57<02:43,  1.08s/it]
 88%|████████▊ | 1111/1261 [19:58<02:41,  1.08s/it]
 88%|████████▊ | 1112/1261 [19:59<02:39,  1.07s/it]
 88%|████████▊ | 1113/1261 [20:00<02:37,  1.07s/it]
 88%|████████▊ | 1114/1261 [20:01<02:37,  1.07s/it]
 88%|████████▊ | 1115/1261 [20:02<02:36,  1.07s/it]
 89%|████████▊ | 1116/1261 [20:03<02:35,  1.07s/it]
 89%|████████▊ | 1117/1261 [20:04<02:34,  1.07s/it]
 89%|████████▊ | 1118/1261 [20:05<02:32,  1.07s/it]
 89%|████████▊ | 1119/1261 [20:06<02:31,  1.07s/it]
 89%|████████▉ | 1120/1261 [20:07<02:29,  1.06s/it]
 89%|████████▉ | 1121/1261 [20:08<02:28,  1.06s/it]
 89%|████████▉ | 1122/1261 [20:09<02:27,  1.06s/it]
 89%|████████▉ | 1123/1261 [20:11<02:26,  1.06s/it]
 89%|████████▉ | 1124/1261 [20:12<02:25,  1.06s/it]
 89%|████████▉ | 1125/1261 [20:13<02:24,  1.06s/it]
 89%|████████▉ | 1126/1261 [20:14<02:22,  1.06s/it]
 89%|████████▉ | 1127/1261 [20:15<02:20,  1.05s/it]
 89%|████████▉ | 1128/1261 [20:16<02:20,  1.06s/it]
 90%|████████▉ | 1129/1261 [20:17<02:19,  1.06s/it]
 90%|████████▉ | 1130/1261 [20:18<02:18,  1.05s/it]
 90%|████████▉ | 1131/1261 [20:19<02:17,  1.06s/it]
 90%|████████▉ | 1132/1261 [20:20<02:17,  1.07s/it]
 90%|████████▉ | 1133/1261 [20:21<02:16,  1.07s/it]
 90%|████████▉ | 1134/1261 [20:22<02:15,  1.07s/it]
 90%|█████████ | 1135/1261 [20:23<02:14,  1.07s/it]
 90%|█████████ | 1136/1261 [20:24<02:14,  1.07s/it]
 90%|█████████ | 1137/1261 [20:25<02:12,  1.07s/it]
 90%|█████████ | 1138/1261 [20:26<02:11,  1.07s/it]
 90%|█████████ | 1139/1261 [20:28<02:10,  1.07s/it]
 90%|█████████ | 1140/1261 [20:29<02:08,  1.07s/it]
 90%|█████████ | 1141/1261 [20:30<02:07,  1.06s/it]
 91%|█████████ | 1142/1261 [20:31<02:06,  1.06s/it]
 91%|█████████ | 1143/1261 [20:32<02:04,  1.06s/it]
 91%|█████████ | 1144/1261 [20:33<02:03,  1.06s/it]
 91%|█████████ | 1145/1261 [20:34<02:03,  1.06s/it]
 91%|█████████ | 1146/1261 [20:35<02:02,  1.06s/it]
 91%|█████████ | 1147/1261 [20:36<02:01,  1.06s/it]
 91%|█████████ | 1148/1261 [20:37<01:59,  1.06s/it]
 91%|█████████ | 1149/1261 [20:38<01:58,  1.06s/it]
 91%|█████████ | 1150/1261 [20:39<01:58,  1.07s/it]
 91%|█████████▏| 1151/1261 [20:40<01:56,  1.06s/it]
 91%|█████████▏| 1152/1261 [20:41<01:55,  1.06s/it]
 91%|█████████▏| 1153/1261 [20:42<01:54,  1.06s/it]
 92%|█████████▏| 1154/1261 [20:44<01:56,  1.09s/it]
 92%|█████████▏| 1155/1261 [20:45<01:54,  1.08s/it]
 92%|█████████▏| 1156/1261 [20:46<01:52,  1.07s/it]
 92%|█████████▏| 1157/1261 [20:47<01:50,  1.06s/it]
 92%|█████████▏| 1158/1261 [20:48<01:49,  1.06s/it]
 92%|█████████▏| 1159/1261 [20:49<01:49,  1.07s/it]
 92%|█████████▏| 1160/1261 [20:50<01:47,  1.07s/it]
 92%|█████████▏| 1161/1261 [20:51<01:45,  1.06s/it]
 92%|█████████▏| 1162/1261 [20:52<01:44,  1.06s/it]
 92%|█████████▏| 1163/1261 [20:53<01:44,  1.06s/it]
 92%|█████████▏| 1164/1261 [20:54<01:44,  1.07s/it]
 92%|█████████▏| 1165/1261 [20:55<01:42,  1.06s/it]
 92%|█████████▏| 1166/1261 [20:56<01:41,  1.06s/it]
 93%|█████████▎| 1167/1261 [20:57<01:39,  1.06s/it]
 93%|█████████▎| 1168/1261 [20:58<01:39,  1.07s/it]
 93%|█████████▎| 1169/1261 [20:59<01:38,  1.07s/it]
 93%|█████████▎| 1170/1261 [21:01<01:37,  1.07s/it]
 93%|█████████▎| 1171/1261 [21:02<01:35,  1.07s/it]
 93%|█████████▎| 1172/1261 [21:03<01:34,  1.06s/it]
 93%|█████████▎| 1173/1261 [21:04<01:34,  1.07s/it]
 93%|█████████▎| 1174/1261 [21:05<01:33,  1.07s/it]
 93%|█████████▎| 1175/1261 [21:06<01:32,  1.07s/it]
 93%|█████████▎| 1176/1261 [21:07<01:30,  1.06s/it]
 93%|█████████▎| 1177/1261 [21:08<01:29,  1.07s/it]
 93%|█████████▎| 1178/1261 [21:09<01:27,  1.06s/it]
 93%|█████████▎| 1179/1261 [21:10<01:26,  1.05s/it]
 94%|█████████▎| 1180/1261 [21:11<01:25,  1.06s/it]
 94%|█████████▎| 1181/1261 [21:12<01:24,  1.06s/it]
 94%|█████████▎| 1182/1261 [21:13<01:23,  1.06s/it]
 94%|█████████▍| 1183/1261 [21:14<01:22,  1.06s/it]
 94%|█████████▍| 1184/1261 [21:15<01:21,  1.06s/it]
 94%|█████████▍| 1185/1261 [21:16<01:20,  1.06s/it]
 94%|█████████▍| 1186/1261 [21:18<01:19,  1.06s/it]
 94%|█████████▍| 1187/1261 [21:19<01:18,  1.06s/it]
 94%|█████████▍| 1188/1261 [21:20<01:17,  1.06s/it]
 94%|█████████▍| 1189/1261 [21:21<01:16,  1.06s/it]
 94%|█████████▍| 1190/1261 [21:22<01:15,  1.06s/it]
 94%|█████████▍| 1191/1261 [21:23<01:14,  1.06s/it]
 95%|█████████▍| 1192/1261 [21:24<01:13,  1.07s/it]
 95%|█████████▍| 1193/1261 [21:25<01:12,  1.06s/it]
 95%|█████████▍| 1194/1261 [21:26<01:11,  1.06s/it]
 95%|█████████▍| 1195/1261 [21:27<01:10,  1.07s/it]
 95%|█████████▍| 1196/1261 [21:28<01:09,  1.07s/it]
 95%|█████████▍| 1197/1261 [21:29<01:08,  1.07s/it]
 95%|█████████▌| 1198/1261 [21:30<01:07,  1.07s/it]
 95%|█████████▌| 1199/1261 [21:31<01:06,  1.07s/it]
 95%|█████████▌| 1200/1261 [21:32<01:05,  1.07s/it]
 95%|█████████▌| 1201/1261 [21:34<01:04,  1.07s/it]
 95%|█████████▌| 1202/1261 [21:35<01:03,  1.07s/it]
 95%|█████████▌| 1203/1261 [21:36<01:01,  1.07s/it]
 95%|█████████▌| 1204/1261 [21:37<01:00,  1.07s/it]
 96%|█████████▌| 1205/1261 [21:38<00:59,  1.07s/it]
 96%|█████████▌| 1206/1261 [21:39<00:58,  1.07s/it]
 96%|█████████▌| 1207/1261 [21:40<00:57,  1.07s/it]
 96%|█████████▌| 1208/1261 [21:41<00:57,  1.08s/it]
 96%|█████████▌| 1209/1261 [21:42<00:55,  1.07s/it]
 96%|█████████▌| 1210/1261 [21:43<00:55,  1.08s/it]
 96%|█████████▌| 1211/1261 [21:44<00:53,  1.07s/it]
 96%|█████████▌| 1212/1261 [21:45<00:52,  1.08s/it]
 96%|█████████▌| 1213/1261 [21:46<00:51,  1.07s/it]
 96%|█████████▋| 1214/1261 [21:47<00:49,  1.06s/it]
 96%|█████████▋| 1215/1261 [21:49<00:48,  1.06s/it]
 96%|█████████▋| 1216/1261 [21:50<00:47,  1.06s/it]
 97%|█████████▋| 1217/1261 [21:51<00:46,  1.06s/it]
 97%|█████████▋| 1218/1261 [21:52<00:45,  1.06s/it]
 97%|█████████▋| 1219/1261 [21:53<00:44,  1.05s/it]
 97%|█████████▋| 1220/1261 [21:54<00:43,  1.06s/it]
 97%|█████████▋| 1221/1261 [21:55<00:42,  1.06s/it]
 97%|█████████▋| 1222/1261 [21:56<00:41,  1.06s/it]
 97%|█████████▋| 1223/1261 [21:57<00:40,  1.07s/it]
 97%|█████████▋| 1224/1261 [21:58<00:39,  1.06s/it]
 97%|█████████▋| 1225/1261 [21:59<00:38,  1.06s/it]
 97%|█████████▋| 1226/1261 [22:00<00:37,  1.06s/it]
 97%|█████████▋| 1227/1261 [22:01<00:37,  1.09s/it]
 97%|█████████▋| 1228/1261 [22:02<00:35,  1.08s/it]
 97%|█████████▋| 1229/1261 [22:03<00:34,  1.09s/it]
 98%|█████████▊| 1230/1261 [22:05<00:33,  1.08s/it]
 98%|█████████▊| 1231/1261 [22:06<00:32,  1.07s/it]
 98%|█████████▊| 1232/1261 [22:07<00:31,  1.07s/it]
 98%|█████████▊| 1233/1261 [22:08<00:29,  1.07s/it]
 98%|█████████▊| 1234/1261 [22:09<00:29,  1.07s/it]
 98%|█████████▊| 1235/1261 [22:10<00:27,  1.07s/it]
 98%|█████████▊| 1236/1261 [22:11<00:26,  1.07s/it]
 98%|█████████▊| 1237/1261 [22:12<00:25,  1.07s/it]
 98%|█████████▊| 1238/1261 [22:13<00:24,  1.07s/it]
 98%|█████████▊| 1239/1261 [22:14<00:23,  1.06s/it]
 98%|█████████▊| 1240/1261 [22:15<00:22,  1.06s/it]
 98%|█████████▊| 1241/1261 [22:16<00:21,  1.06s/it]
 98%|█████████▊| 1242/1261 [22:17<00:20,  1.06s/it]
 99%|█████████▊| 1243/1261 [22:18<00:19,  1.06s/it]
 99%|█████████▊| 1244/1261 [22:19<00:18,  1.06s/it]
 99%|█████████▊| 1245/1261 [22:21<00:17,  1.07s/it]
 99%|█████████▉| 1246/1261 [22:22<00:16,  1.07s/it]
 99%|█████████▉| 1247/1261 [22:23<00:15,  1.08s/it]
 99%|█████████▉| 1248/1261 [22:24<00:13,  1.08s/it]
 99%|█████████▉| 1249/1261 [22:25<00:12,  1.07s/it]
 99%|█████████▉| 1250/1261 [22:26<00:11,  1.06s/it]
 99%|█████████▉| 1251/1261 [22:27<00:10,  1.06s/it]
 99%|█████████▉| 1252/1261 [22:28<00:09,  1.06s/it]
 99%|█████████▉| 1253/1261 [22:29<00:08,  1.06s/it]
 99%|█████████▉| 1254/1261 [22:30<00:07,  1.05s/it]
100%|█████████▉| 1255/1261 [22:31<00:06,  1.05s/it]
100%|█████████▉| 1256/1261 [22:32<00:05,  1.05s/it]
100%|█████████▉| 1257/1261 [22:33<00:04,  1.05s/it]
100%|█████████▉| 1258/1261 [22:34<00:03,  1.05s/it]
100%|█████████▉| 1259/1261 [22:35<00:02,  1.05s/it]
100%|█████████▉| 1260/1261 [22:36<00:01,  1.06s/it]
[MoviePy] Done.
[MoviePy] >>>> Video ready: output.mp4 

CPU times: user 22min 31s, sys: 1min 20s, total: 23min 52s
Wall time: 22min 37s

Old codes

Those codes bellow are the ones that I use to filter the lane-line pixals, it's based on histogram instead of the convolution method

In [53]:
histogram = np.sum(warped[warped.shape[0]/2:,:], axis=0)
plt.plot(histogram)
/Users/zhongming/anaconda/envs/keras/lib/python3.5/site-packages/ipykernel/__main__.py:1: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  if __name__ == '__main__':
Out[53]:
[<matplotlib.lines.Line2D at 0x1298e80f0>]
In [ ]:
 
In [175]:
histogram_left = histogram[0:len(histogram)/2]
histogram_right = histogram[len(histogram)/2:len(histogram)]

idx_l = np.argmax(histogram_left)
idx_r = np.argmax(histogram_right)

warp = np.copy(warped)
warp = np.zeros((*warped.shape, 3), dtype=np.uint8)
lines = np.zeros((*warped.shape, 3), dtype=np.uint8)

curve_points_l_row = []
curve_points_l_column = []
curve_points_r_row = []
curve_points_r_column = []

div = 8
for i in range(0,div):
    j = div - 1 -i
    img_j = warped[warped.shape[0]/div*j : warped.shape[0]/div*(j+1),:]
    img_j_left = img_j[:,0:len(img_j[0])/2]
    img_j_right = img_j[:,len(img_j[0])/2:len(img_j[0])]
    
    hist_data = []
    for k in range(idx_l - 50,idx_l + 50):
        left_window_l = img_j_left[:,k - 100:k]
        left_window_r = img_j_left[:,k:k + 100]
        
        hist_l = np.sum(np.sum(left_window_l[:,:], axis=0), axis =0)
        hist_r = np.sum(np.sum(left_window_r[:,:], axis=0), axis =0)
        
        if ((int)(hist_l) < 10) | ((int)(hist_r) < 10):
            hist_data.append(10000)
        else:
            hist_data.append(abs(hist_l-hist_r))
       
    center_left = np.argmin(hist_data)
    cl_min = np.min(hist_data)
    if cl_min != 10000:
        center_left = center_left + idx_l - 50
        idx_l = center_left
    
#     print(hist_data)
    
    hist_data_r = []
    for l in range(idx_r - 50,idx_r + 50):
        right_window_l = img_j_right[:,l - 100:l]
        right_window_r = img_j_right[:,l:l + 100]
              
        hist_l = np.sum(np.sum(right_window_l[:,:], axis=0), axis =0)
        hist_r = np.sum(np.sum(right_window_r[:,:], axis=0), axis =0)
        
        if ((int)(hist_l) < 10) | ((int)(hist_r) < 10):
            hist_data_r.append(10000)
#             print("abc")
        else:
            hist_data_r.append(abs(hist_l-hist_r))
    
    center_right = np.argmin(hist_data_r)
    cr_min = np.min(hist_data_r)
    if cr_min != 10000:
#     print(center_right)
        center_right = center_right + idx_r - 50
        idx_r = center_right
    
        
    print(idx_l)
    cv2.line(lines, (idx_l, (int)(warped.shape[0]/div*j)), (idx_l, (int)(warped.shape[0]/div*(j+1))), color=[255, 0, 0], thickness=2)
#     print(hist_data_r)
    
    left_img = img_j_left[:,center_left - 100:center_left+100]
    points_l = np.nonzero(left_img)
    points_l_row = points_l[0]
    points_l_column = points_l[1]
    
    points_l_row += (int)(warped.shape[0]/div*j)
    points_l_column += center_left - 100
    
    curve_points_l_row = np.concatenate((curve_points_l_row, points_l_row), axis=0)
    curve_points_l_column = np.concatenate((curve_points_l_column, points_l_column), axis=0)
    
    
    
    right_img = img_j_right[:,center_right - 100:center_right+100]
    points_r = np.nonzero(right_img)
    points_r_row = points_r[0]
    points_r_column = points_r[1]
    
    points_r_row += (int)(warped.shape[0]/div*j)
    points_r_column += center_right - 100 + (int)(len(histogram)/2)
    
    curve_points_r_row = np.concatenate((curve_points_r_row, points_r_row), axis=0)
    curve_points_r_column = np.concatenate((curve_points_r_column, points_r_column), axis=0)
    
#     right_img = img_j_right[:,center_right - 100:center_right+100]
#     points_l = np.transpose(np.nonzero(left_img))
#     curve_points_l.append(points_l)
    
#     cv2.line(warp, (center_left, (int)(warped.shape[0]/6*j)), (center_left, (int)(warped.shape[0]/6*(j+1))), 255, 2)
#     cv2.line(warp, (center_right + (int)(len(histogram)/2), (int)(warped.shape[0]/6*j)), (center_right + (int)(len(histogram)/2), (int)(warped.shape[0]/6*(j+1))), [255,0,0], 2)
    
#     print(center_left)
#     print(center_right)
# print(curve_points_l_row)       
for n in range(0,len(curve_points_l_row)):
    y = (int)(curve_points_l_row[n])
    x = (int)(curve_points_l_column[n])
    cv2.line(warp, (x, y), (x-1, y), color=[255, 255, 255], thickness=2)

for n in range(0,len(curve_points_r_row)):
    y = (int)(curve_points_r_row[n])
    x = (int)(curve_points_r_column[n])
    cv2.line(warp, (x, y), (x-1, y), color=[255, 255, 255], thickness=2)
    
    
result = cv2.addWeighted(warp, 0.2, lines, 1, 0)
    
# print(curve_points_l[0])
plt.imshow(result) 
# plt.plot(hist_l)
    
/Users/zhongming/anaconda/envs/keras/lib/python3.5/site-packages/ipykernel/__main__.py:1: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  if __name__ == '__main__':
/Users/zhongming/anaconda/envs/keras/lib/python3.5/site-packages/ipykernel/__main__.py:2: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  from ipykernel import kernelapp as app
/Users/zhongming/anaconda/envs/keras/lib/python3.5/site-packages/ipykernel/__main__.py:19: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
/Users/zhongming/anaconda/envs/keras/lib/python3.5/site-packages/ipykernel/__main__.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
/Users/zhongming/anaconda/envs/keras/lib/python3.5/site-packages/ipykernel/__main__.py:21: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
367
381
397
415
436
459
485
514
Out[175]:
<matplotlib.image.AxesImage at 0x11db95668>
In [280]:
# Fit a second order polynomial to each fake lane line
left_fit = np.polyfit(curve_points_l_row, curve_points_l_column, 2)
left_fitx = left_fit[0]*curve_points_l_row**2 + left_fit[1]*curve_points_l_row + left_fit[2]
right_fit = np.polyfit(curve_points_r_row, curve_points_r_column, 2)
right_fitx = right_fit[0]*curve_points_r_row**2 + right_fit[1]*curve_points_r_row + right_fit[2]

# Plot up the fake data
plt.plot(curve_points_l_column, curve_points_l_row, 'o', color='red')
plt.plot(curve_points_r_column, curve_points_r_row, 'o', color='blue')
plt.xlim(0, 1280)
plt.ylim(0, 720)
plt.plot(left_fitx, curve_points_l_row, color='green', linewidth=3)
plt.plot(right_fitx, curve_points_r_row, color='green', linewidth=3)
plt.gca().invert_yaxis() # to visualize as we do the images
In [221]:
y_eval = np.max(curve_points_l_row)
left_curverad = ((1 + (2*left_fit[0]*y_eval + left_fit[1])**2)**1.5) \
                             /np.absolute(2*left_fit[0])

y_eval = np.max(curve_points_r_row)
right_curverad = ((1 + (2*right_fit[0]*y_eval + right_fit[1])**2)**1.5) \
                                /np.absolute(2*right_fit[0])
print(left_curverad, right_curverad)
2679.99238647 2168.81126161
In [222]:
# Define conversions in x and y from pixels space to meters
ym_per_pix = 30/720 # meters per pixel in y dimension
xm_per_pix = 3.7/650 # meteres per pixel in x dimension

left_fit_cr = np.polyfit(curve_points_l_row*ym_per_pix, curve_points_l_column*xm_per_pix, 2)
right_fit_cr = np.polyfit(curve_points_r_row*ym_per_pix, curve_points_r_column*xm_per_pix, 2)
left_curverad = ((1 + (2*left_fit_cr[0]*y_eval + left_fit_cr[1])**2)**1.5) \
                             /np.absolute(2*left_fit_cr[0])
right_curverad = ((1 + (2*right_fit_cr[0]*y_eval + right_fit_cr[1])**2)**1.5) \
                                /np.absolute(2*right_fit_cr[0])
# Now our radius of curvature is in meters
print(left_curverad, 'm', right_curverad, 'm')
1797.17553065 m 2014.94508477 m
In [226]:
# left_fitx = curve_points_l_row
ploty1 = curve_points_l_row
# right_fitx = curve_points_r_row
ploty2 = curve_points_r_row
In [227]:
# Create an image to draw the lines on
warp_zero = np.zeros_like(warped).astype(np.uint8)
color_warp = np.dstack((warp_zero, warp_zero, warp_zero))

# Recast the x and y points into usable format for cv2.fillPoly()
pts_left = np.array([np.transpose(np.vstack([left_fitx, ploty1]))])
pts_right = np.array([np.flipud(np.transpose(np.vstack([right_fitx, ploty2])))])
pts = np.hstack((pts_left, pts_right))


# Draw the lane onto the warped blank image
cv2.fillPoly(color_warp, np.int_([pts]), (0,255, 0))
print(left_fitx)
# Warp the blank back to original image space using inverse perspective matrix (Minv)
newwarp = cv2.warpPerspective(color_warp, Minv, (imageTest.shape[1], imageTest.shape[0])) 
# Combine the result with the original image
result = cv2.addWeighted(imageTest, 1, newwarp, 0.3, 0)
plt.imshow(result)
[ 526.90061959  526.90061959  526.90061959 ...,  350.55295431  350.55295431
  350.55295431]
Out[227]:
<matplotlib.image.AxesImage at 0x151bbd710>

Summary

Keras is a great tool to use if you want to quickly build a neural network and evaluate performance.